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