xml解析: dom4j
目錄
一、XML解析
1.概述
2.解析方式和解析器
二、Dom4j的基本使用
1.解析原理
2.基本使用
2.常用方法
(1)SaxReader對(duì)象
(2)Document對(duì)象
(3)Element對(duì)象
三、dom4j練習(xí)
1.使用dom4j查詢xml
2.使用dom4j實(shí)現(xiàn)添加操作
3.使用dom4j實(shí)現(xiàn)在特定位置添加元素?
4.使用dom4j實(shí)現(xiàn)修改節(jié)點(diǎn)的操作
5.使用dom4j實(shí)現(xiàn)刪除節(jié)點(diǎn)的操作
6.使用dom4j獲取屬性的操作
7.使用dom4j支持xpath的操作
8.使用dom4j支持xpath具體操作
一、XML解析
1.概述
當(dāng)將數(shù)據(jù)存儲(chǔ)在XML后,我們就希望通過程序獲取XML的內(nèi)容。人們?yōu)椴煌瑔栴}提供不同的解析方式,使用不同的解析器進(jìn)行解析,方便開發(fā)人員操作XML。
2.解析方式和解析器
開發(fā)中比較常見的解析方式有三種,如下:
(1)DOM:要求解析器把整個(gè)XML文檔裝載到內(nèi)存,并解析成一個(gè)Document對(duì)象
a)優(yōu)點(diǎn):元素與元素之間保留結(jié)構(gòu)關(guān)系,故可以進(jìn)行增刪改查操作。
b)缺點(diǎn):XML文檔過大,可能出現(xiàn)內(nèi)存溢出
(2)SAX:是一種速度更快,更有效的方法。她逐行掃描文檔,一邊掃描一邊解析。并以事件驅(qū)動(dòng)的方式進(jìn)行具體解析,每執(zhí)行一行,都觸發(fā)對(duì)應(yīng)的事件。(了解)
a)優(yōu)點(diǎn):處理速度快,可以處理大文件
b)缺點(diǎn):只能讀,逐行后將釋放資源,解析操作繁瑣。
(3)PULL:Android內(nèi)置的XML解析方式,類似SAX。(了解)
?
解析器,就是根據(jù)不同的解析方式提供具體實(shí)現(xiàn)。
(1)常見的解析開發(fā)包
JAXP:sun公司提供支持DOM和SAX開發(fā)包
Dom4j:比較簡(jiǎn)單的的解析開發(fā)包(常用)
JDom:與Dom4j類似
Jsoup:功能強(qiáng)大DOM方式的XML解析開發(fā)包,尤其對(duì)HTML解析更加方便(項(xiàng)目中講解)
二、Dom4j的基本使用
1.解析原理
XML DOM 和 HTML DOM一樣,XML DOM 將整個(gè)XML文檔加載到內(nèi)存,生成一個(gè)DOM樹,并獲得一個(gè)Document對(duì)象,通過Document對(duì)象就可以對(duì)DOM進(jìn)行操作。
2.基本使用
需要引入? ?jar/dom4j-1.6.1.jar
dom4j 必須使用核心類SaxReader加載xml文檔獲得Document,通過Document對(duì)象獲得文檔的根元素,然后就可以操作了。
2.常用方法
(1)SaxReader對(duì)象
(2)Document對(duì)象
(3)Element對(duì)象
三、dom4j練習(xí)
1.使用dom4j查詢xml
//1、創(chuàng)建解析器SAXReader reader = new SAXReader();//2、得到documentDocument doc = reader.read("src/Person.xml");//3、得到根節(jié)點(diǎn)Element root = doc.getRootElement();//4、得到所有的student標(biāo)簽List<Element> list = root.elements("student");//5.遍歷for (Element element : list) {Element name = element.element("name");System.out.println(name.getText());}2.使用dom4j實(shí)現(xiàn)添加操作
* 在第一個(gè)student標(biāo)簽?zāi)┪蔡砑右粋€(gè)元素 <sex>男</sex>
//創(chuàng)建解析器SAXReader sr = new SAXReader();//得到documentDocument doc = sr.read("/person.xml");//得到根節(jié)點(diǎn)Element root = doc.getRootElement();//得到第一個(gè)student節(jié)點(diǎn)Element e1 = root.element("student");//添加sex標(biāo)簽Element sex = e1.addElement("sex");//給標(biāo)簽添加內(nèi)容sex.setText("男");//回寫xml,使用XMLWriter類OutputFormat opf = OutputFormat.createPrettyPrint();XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("/person.xml"), opf);xmlWriter.write(doc);//關(guān)閉流xmlWriter.close();3.使用dom4j實(shí)現(xiàn)在特定位置添加元素?
* 在所有student下面的age標(biāo)簽之前添加 <hobby>籃球</hobby>
// 創(chuàng)建解析器SAXReader sr = new SAXReader();// 得到documentDocument doc = sr.read("/person.xml");// 得到根節(jié)點(diǎn)Element root = doc.getRootElement();// 得到所有student標(biāo)簽List<Element> list = root.elements("student");// 遍歷student標(biāo)簽for (Element element : list) {// 得到student標(biāo)簽的每一個(gè)子標(biāo)簽List<Element> list2 = element.elements();// 使用DocumentHelper類來創(chuàng)建標(biāo)簽Element hobby = DocumentHelper.createElement("hobby");hobby.setText("籃球");// 加到age所在的角標(biāo)位置list2.add(1, hobby);}// 回寫xmlXMLWriter xmlWriter = new XMLWriter(new FileOutputStream("/person.xml"), new OutputFormat().createPrettyPrint());xmlWriter.write(doc);// 關(guān)閉流xmlWriter.close();4.使用dom4j實(shí)現(xiàn)修改節(jié)點(diǎn)的操作
* 修改第一個(gè)student下面的age元素的值 <age>28</age>
public static void main(String[] args) throws Exception {String path = "person.xml";Document doc = createMySAXReader(path);// 得到根節(jié)點(diǎn)Element root = doc.getRootElement();//得到第一個(gè)student節(jié)點(diǎn)Element e1 = root.element("student");//修改該節(jié)點(diǎn)的age值e1.element("age").setText("26");ReWrite(path, doc);}public static Document createMySAXReader(String path) throws Exception {// 創(chuàng)建解析器SAXReader sr = new SAXReader();// 得到documentDocument doc = sr.read(path);return doc;}// 回寫xml方法public static void ReWrite(String path, Document doc) throws Exception {XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(path),new OutputFormat().createPrettyPrint());xmlWriter.write(doc);xmlWriter.close();}5.使用dom4j實(shí)現(xiàn)刪除節(jié)點(diǎn)的操作
* 刪除第一個(gè)student下面的<hobby>籃球</hobby>元素
String path = "person.xml";Document doc = createMySAXReader(path);// 得到根節(jié)點(diǎn)Element root = doc.getRootElement();// 得到第一個(gè)student節(jié)點(diǎn)Element e1 = root.element("student");Element e2 = e1.element("hobby");// 通過父節(jié)點(diǎn)刪除hobby節(jié)點(diǎn)e1.remove(e2);ReWrite(path, doc);6.使用dom4j獲取屬性的操作
* 獲取第一個(gè)student里面的屬性id1的值
String path = "person.xml";Document doc = createMySAXReader(path);// 得到根節(jié)點(diǎn)Element root = doc.getRootElement();// 得到第一個(gè)student節(jié)點(diǎn)Element e1 = root.element("student");// 通過attributeValue()方法得到id1屬性的值String value=e1.element("name").attributeValue("id");System.out.println(value);7.使用dom4j支持xpath的操作
(1)/AAA/DDD/BBB:表示一層一層的,AAA下面的DDD下面的BBB元素
(2)//BBB:表示和這個(gè)名稱相同,只要名稱是BBB,都得到
(3)/*:所有元素
(4)BBB[1]:表示第一個(gè)BBB元素
(5)BBB[last()]:表示最后一個(gè)BBB元素
(6)//BBB[@id]:表示只要BBB元素上面有id屬性,都得到
(7)//BBB[@id='b1']:表示元素名稱是BBB,在BBB上面有id屬性,并且id的屬性值是b1
8.使用dom4j支持xpath具體操作
dom4j中要使用xpath,需要引入支持xpath的jar包
?jaxen-1.1-beta-6.jar
在dom4j里面提供了兩個(gè)方法,用來支持xpath
(1)List selectNodes("表達(dá)式"):獲取符合表達(dá)式的元素集合
(2)Element selectSingleNode("表達(dá)式"):獲取符合表達(dá)式的唯一元素
String path = "src/Person.xml"; Document doc = createMySAXReader(path); // 使用selectNodes("//name")方法得到所有的name元素 List<Node> list = doc.selectNodes("//name"); // 遍歷list集合 for (Node node : list) {// 得到name元素里面的值System.out.println(node.getText()); }使用xpath實(shí)現(xiàn):獲取第一個(gè)student下面的name的值
所有name元素的xpath表示:/person/student[1]/name
selectSingleNode("?/person/student[1]/name");
String path = "src/Person.xml"; Document doc = createMySAXReader(path); // 使用selectSingleNode方法得到指定的name元素 Node node = doc.selectSingleNode("/person/student[1]/name"); System.out.println(node.getText());?
總結(jié)
以上是生活随笔為你收集整理的xml解析: dom4j的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: XML简介及基本语法
- 下一篇: xml解析案例:一个简单的学生管理系统