Dom解析原理:xml解析器一次性將xml文檔加載到內存中,而後在內存中構建一顆Document對象樹。在經過Document對象獲得樹上的節點對象,經過節點對象操做文檔內容。java
Dom4J 經常使用的對象: node
SAXReader:讀取 xml 文件到 Document 樹結構文件對象 web
Document:是一個 xml 文檔對象樹,類比 Html 文檔對象。 編程
Element:元素節點。經過 Document 對象能夠查找單個元素 dom
使用步驟:函數
( 導入 Dom4J.jar 包 dom4j-1.6.1.jar )工具 1.建立SaxReader解析器ui SAXReader Reader = new SAXReader();編碼 2.經過read方法得到Document對象lua Document document = Reader.read("conf/student.xml"); Element rootEle = document.getRootElement(); 4.4.經過迭代器遍歷xml文檔 Iterator it = rootEle.elementIterator(); while (it.hasNext()) { Element stusEle = (Element) it.next(); Iterator it01 = stusEle.elementIterator(); while (it01.hasNext()) { Element stuEle = (Element) it01.next(); System.out.println(stuEle.getStringValue()); } System.out.println("--------------------------------"); } Dom4j官方文檔中有quick start 能夠幫助咱們快速使用該技術!
|
Sax解析工具是sun公司提供的,內至於jdk中。Org.xml.sax.*;
sax解析原理:事件驅動,邊讀邊寫
當遇到開始標籤時,自動調用startElement(String url,String localName,String qname,Attribute attribute)方法;當遇到文本時,自動執行characters(char[]ch,int start,int length);當遇到結束標籤時自動執行endElement(String url,String localName,String qName)方法。
<結束標籤以’/’做爲標誌,結束方法比開始方法只少一個attribute 參數>
使用步驟:
1.建立解析工廠 //SAXParserFactory 構造方法被保護,只能經過 .newInstance()方法建立實例 SAXParserFactory saxParserFactory = SAXParserFactory.newInstance(); 2.建立解析器 //經過工廠建立解析器 SAXParser saxParser = saxParserFactory.newSAXParser(); 3.執行parser方法 // 執行 parser 方法,傳入兩個參數:xml 文件路徑、事件處理器 saxParser.parse("conf/student.xml", new MyDefaultHandler()); 所謂事件處理器是指 一個繼承與 DefaultHandler 的類,進行重寫其中的startElement()、characters()、endElement()方法實現相應的處理。 建立一個類,繼承 DefaultHander 類,重寫三個方法: A、 startElement 獲取開始標籤,重要的兩個參數說明 a、 qName:把標籤名稱返回 b、 attributes:返回標籤中的屬性對象 B、 character 獲取標籤文本內容 C、 endElement 獲取結束標籤
|
============DOM解析 vs SAX解析 ========
DOM解析 |
SAX解析 |
原理: 一次性加載xml文檔,不適合大容量的文件讀取 |
原理: 加載一點,讀取一點,處理一點。適合大容量文件的讀取 |
DOM解析能夠任意進行增刪改爲 |
SAX解析只能讀取 |
DOM解析任意讀取任何位置的數據,甚至往回讀 |
SAX解析只能從上往下,按順序讀取,不能往回讀 |
DOM解析面向對象的編程方法(Node,Element,Attribute),Java開發者編碼比較簡單。 |
SAX解析基於事件的編程方法。java開發編碼相對複雜。 |
主要是用於快速獲取所需的節點對象。
選擇節點:XPath 使用路徑表達式在 XML 文檔中選取節點。節點是經過沿着
路徑或者 step 來選取的。下面列出了最有用的路徑表達式:
表達式 描述
nodename 選取此節點的全部子節點。
/ 從根節點選取。
// 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。
. 選取當前節點。
.. 選取當前節點的父節點。
@ 選取屬性。
text()獲取節點的文本內容函數
使用步驟:
// 1.經過DocumentBuilderFactor建立解析工廠 DocumentBuilderFactory builderFactory = DocumentBuilderFactory .newInstance(); // 2.經過工廠得到解析器 DocumentBuilder builder = builderFactory.newDocumentBuilder(); // 3.經過parser方法獲取Document Document document = builder.parse("conf/books.xml"); // 4.獲取xpath對象 XPath xpath = XPathFactory.newInstance().newXPath(); // 5.獲取 bookstore 節點下 book 屬性 category 值爲 web 下的第二個title 節點的文本內容 String exp = "/bookstore/book[@category='web'][2]/title/text()"; String tit = (String) xpath.evaluate(exp, document, XPathConstants.STRING); System.out.println(tit); // 獲取 bookstore 節點下 book 屬性 category 值爲 web 的 titile 屬性爲 en 的節點內容 String expEn = "/bookstore/book[@category='web']/title[@lang ='en']/text()"; String titEN = (String) xpath.evaluate(expEn, document, XPathConstants.STRING); System.out.println(titEN); // 獲取 bookstore 下 book 屬性 category 值爲 cooking 的 title 的 lang 屬性的值 String expLan = "/bookstore/book[@category='cooking']/title/@lang"; String lang = (String) xpath.evaluate(expLan, document, XPathConstants.STRING); System.out.println(lang);
|
// 獲取 bookstore 節點下全部 book 的節點集合(遍歷該文檔) String expB = "/bookstore/book"; NodeList books =(NodeList) xpath.evaluate(expB, document, XPathConstants.NODESET); for (int i = 0; i < books.getLength(); i++) { Element book =(Element) books.item(i); String title =(String) xpath.evaluate("title/text()", book, XPathConstants.STRING); String author =(String) xpath.evaluate("author/text()", book, XPathConstants.STRING); String year =(String) xpath.evaluate("year", book, XPathConstants.STRING); String price =(String) xpath.evaluate("price", book, XPathConstants.STRING); System.out.println(title+" "+author+" "+year+" "+price); System.out.println("----------------------------------------------------"); } |
開發中Dom4j和XPath結合使用很是靈活,因此應用普遍!
使用步驟:
1)導入xPath支持jar包 。 jaxen-1.1-beta-6.jar 2)使用xpath方法 List<Node> selectNodes("xpath表達式"); 查詢多個節點對象 Node selectSingleNode("xpath表達式"); 查詢一個節點對象 |
//1.SAXReader解析器 SAXReader reader = new SAXReader(); //2.經過read方法得到Document Document document =reader.read("conf/bookstore.xml"); //3.xpath路勁 String titlePath ="/bookstore/book[1]/title"; Element element =(Element) document.selectObject(titlePath); String title =element.getStringValue(); System.out.println(title); |