三、XML的解析
XML的解析一共有2種方式:DOM解析:(DOM:Document Object Model)SAX解析:(Simple Api for XML)
* DOM:文檔對(duì)象模型。這種方式是W3C推薦的處理XML的一種方式沦辙。
* SAX:這種方式不是官方標(biāo)準(zhǔn)总寻,屬于開(kāi)源社區(qū)XML-DEV荧关,幾乎所有的XML解析器都支持它抛猖。
兩者的解析方式的優(yōu)缺點(diǎn)
* DOM解析是一次把DOM樹(shù)都加載到內(nèi)存里進(jìn)行解析,可以對(duì)其進(jìn)行增刪改格仲,但是當(dāng)解析的XML比較大的
時(shí)候可能會(huì)造成內(nèi)存溢出。
* SAX解析是以事件驅(qū)動(dòng)的方式一行一行進(jìn)行解析的诵冒,不會(huì)造成內(nèi)存的溢出凯肋,但是不能對(duì)XML進(jìn)行修改。
針對(duì)這兩種解析的方式汽馋,不同的公司提供了不同的API的實(shí)現(xiàn)
* JAXP :SUN公司提供的一套XML的解析的API.
* JDOM :開(kāi)源組織提供了一套XML的解析的API-jdom.
* DOM4J :開(kāi)源組織提供了一套XML的解析的API-dom4j.
* pull :主要應(yīng)用在Android手機(jī)端解析XML.
java中常用的API為DOM4J侮东。
(一)DOM4J
DOM4J的常用的構(gòu)造和方法:
* 創(chuàng)建SAXReader對(duì)象:new SAXReader()
* 設(shè)置讀取路徑返回Document對(duì)象對(duì)XML進(jìn)行操作:
reader.read(要讀取XML的路徑);
* 創(chuàng)建OutputFormat對(duì)象設(shè)定輸出格式: OutputFormat.createPrettyPrint()
* 根據(jù)輸出路徑和輸出格式創(chuàng)建輸出對(duì)象:
new XMLWriter(new FileOutputStream(輸出路徑, 輸出格式);
DOM4J的常用方法:
* 獲取根元素對(duì)象(根標(biāo)簽):
返回值類(lèi)型 - Element,調(diào)用對(duì)象 - Document getRootElement();
* 獲取所有的子元素:
返回值類(lèi)型 - List ,調(diào)用對(duì)象 - Element elements();
* 根據(jù)指定的元素名稱(chēng)來(lái)獲取相應(yīng)的所有的子元素:
返回值類(lèi)型 - List ,調(diào)用對(duì)象 - Element elements(String name);
* 根據(jù)指定的子元素名稱(chēng),來(lái)獲取子元素中的文本:
返回值類(lèi)型 - String ,調(diào)用對(duì)象 - Element elementText(String name);
* 獲取當(dāng)前元素對(duì)象的文本:
返回值類(lèi)型 - String ,調(diào)用對(duì)象 - Element getText();
* 設(shè)置當(dāng)前元素對(duì)象的文本:
返回值類(lèi)型 - void ,調(diào)用對(duì)象 - Element setText(String text);
* 添加當(dāng)前元素對(duì)象的文本:
返回值類(lèi)型 - Element ,調(diào)用對(duì)象 - Element addText(String text);
* 根據(jù)指定的屬性名稱(chēng)獲取其對(duì)應(yīng)的值:
返回值類(lèi)型 - String ,調(diào)用對(duì)象 - Element attributeValue(String name);
* 根據(jù)指定的屬性名稱(chēng)和值進(jìn)行添加或者修改:
返回值類(lèi)型 - Element ,調(diào)用對(duì)象 - Element addAttribute(String name,String value);
* 刪除某一元素(需父類(lèi)對(duì)象刪除子元素):
返回值類(lèi)型 - void ,調(diào)用對(duì)象 - Element remove(Element element);
* 在目標(biāo)節(jié)點(diǎn)中添加新的節(jié)點(diǎn):
返回值類(lèi)型 - Element ,調(diào)用對(duì)象 - Element addElement(String name);
* 創(chuàng)建一個(gè)新的元素對(duì)象:
返回值類(lèi)型 - Element豹芯,調(diào)用對(duì)象 - DocumentHelper DocumentHelper.createElement(String name);
(二)示例代碼
* 目標(biāo)XML文件:
1 <?xml version="1.0" encoding="UTF-8"?>
2
3 <State Code="37" Name="河南" description="鄭州" GDP="99999億" YY="你YY個(gè)啥勁兒">
4 <City>
5 <Name>鄭州</Name>
6 <Region>高薪區(qū)</Region>
7 </City>
8 <City>普吉島</City>
9 <City>三門(mén)峽</City>
10 <City>安陽(yáng)</City>
11 <City>南陽(yáng)</City>
12 <City>北京</City>
13 </State>
工具類(lèi):
1 public class Dom4jUtils {
2 //私有構(gòu)造
3 private Dom4jUtils() {
4 super();
5 // TODO Auto-generated constructor stub
6 }
7 //創(chuàng)建Document對(duì)象
8 public static Document creatDocument() throws Exception {
9 SAXReader reader = new SAXReader();
10 Document document = reader.read("src\\com\\xmldemo\\city.xml");
11 return document;
12 }
13 //創(chuàng)建輸出對(duì)象
14 public static void write(Document d) throws Exception {
15 OutputFormat format = OutputFormat.createPrettyPrint();
16 XMLWriter writer = new XMLWriter(new FileOutputStream("src\\com\\xmldemo\\city.xml"), format);
17 writer.write(d);
18 }
19 }
一頓操作:
1 /**添加或修改屬性,如果沒(méi)有該屬性就添加有的話就更新
2 * @throws Exception
3 */
4 private static void method07() throws Exception {
5 Document document = Dom4jTUtils.creatDocument();
6 Element rootElement = document.getRootElement();
7 //為根元素添加YY屬性和值
8 Element element = rootElement.addAttribute("YY", "你YY個(gè)啥勁兒");
9 Dom4jTUtils.write(document);
10 }
11
12 /**打印某一節(jié)點(diǎn)的屬性
13 * @throws Exception
14 */
15 private static void method06() throws Exception {
16 Document document = Dom4jTUtils.creatDocument();
17 Element rootElement = document.getRootElement();
18 //獲取Name屬性的值
19 String value = rootElement.attributeValue("Name");
20 System.out.println(value);
21 }
22
23 /**在某一標(biāo)簽位置添加新標(biāo)簽
24 * @throws Exception
25 */
26 private static void method05() throws Exception {
27 Document document = Dom4jTUtils.creatDocument();
28 Element rootElement = document.getRootElement();
29 // 創(chuàng)建一個(gè)新元素對(duì)象
30 Element createElement = DocumentHelper.createElement("City");
31 //為此元素設(shè)置值
32 createElement.setText("普吉島");
33 //遍歷
34 List<Element> list = rootElement.elements();
35 //將此節(jié)點(diǎn)加入到list集合的指定位置
36 list.add(1, createElement);
37 //寫(xiě)回
38 Dom4jTUtils.write(document);
39 }
40
41
42 /**像某已指定元素添加元素
43 * @throws Exception
44 */
45 private static void method04() throws Exception {
46 Document document = Dom4jTUtils.creatDocument();
47 Element rootElement = document.getRootElement();
48 //在Root節(jié)點(diǎn)下添加一個(gè)新節(jié)點(diǎn)"City"
49 Element addElement = rootElement.addElement("City");
50 //為節(jié)點(diǎn)添加文本
51 addElement.addText("北京");
52 //寫(xiě)回
53 Dom4jTUtils.write(document);
54 }
55
56
57 /**刪除某一元素
58 * @throws Exception
59 */
60 private static void methed03() throws Exception {
61 Document document = Dom4jTUtils.creatDocument();
62 Element rootElement = document.getRootElement();
63 List<Element> list = rootElement.elements();
64 //獲取要?jiǎng)h除元素的父元素(刪除只能由父親刪除兒子)
65 Element parent = list.get(2).getParent();
66 //刪除
67 parent.remove(list.get(2));
68 //將document寫(xiě)回
69 Dom4jTUtils.write(document);
70 }
71
72 /**修改某一標(biāo)簽的文本
73 * @throws Exception(為了方便拋出大的異常)
74 */
75 private static void medom02() throws Exception {
76 Document document = Dom4jTUtils.creatDocument();
77 Element rootElement = document.getRootElement();
78 List<Element> list = rootElement.elements();
79 //設(shè)置第三個(gè)元素的文本
80 list.get(2).setText("青青草原");
81 //使用工具類(lèi)將document寫(xiě)回XML文檔
82 Dom4jTUtils.write(document);
83 }
84
85 /**獲取第一個(gè)元素的Name屬性
86 * @throws Exception(為了方便拋出大的異常)
87 */
88 private static void method() throws Exception {
89 //使用工具類(lèi)創(chuàng)建Document對(duì)象
90 Document document = Dom4jTUtils.creatDocument();
91 //獲得根節(jié)點(diǎn)
92 Element element = document.getRootElement();
93 //獲得根節(jié)點(diǎn)下的所有元素節(jié)點(diǎn)
94 List<Element> elements = element.elements();
95 //獲取第一個(gè)節(jié)點(diǎn)的Name屬性文本
96 String name = elements.get(0).elementText("Name");
97 System.out.println(name);
98 }
99
100
101 /**用遞歸的方式遍歷所有元素
102 * @param elements 根節(jié)點(diǎn)
103 */
104 public static void run(Element elements) {
105 //打印每個(gè)元素的名字
106 System.out.println(elements.getName());
107 //獲取每個(gè)節(jié)點(diǎn)
108 List<Element> elements2 = elements.elements();
109 //遞歸調(diào)用
110 for (Element object : elements2) {
111 run(object);
112 }
113 }
歡迎加入學(xué)習(xí)交流群569772982悄雅,大家一起學(xué)習(xí)交流。
object : elements2) {111 run(object);112 }113 }