标簽: Java基礎
XML解析技術有兩種 <code>DOM</code> <code>SAX</code>
DOM方式
根據XML的層級結構在記憶體中配置設定一個樹形結構,把XML的标簽,屬性和文本等元素都封裝成樹的節點對象
優點: 便于實作<code>增</code> <code>删</code> <code>改</code> <code>查</code>
缺點: XML檔案過大可能造成記憶體溢出
SAX方式
采用事件驅動模型邊讀邊解析:從上到下一行行解析,解析到某一進制素, 調用相應解析方法
優點: 不會造成記憶體溢出,
缺點: 查詢不友善,但不能實作 <code>增</code> <code>删</code> <code>改</code>
不同的公司群組織提供了針對DOM和SAX兩種方式的解析器
SUN的<code>jaxp</code>
Dom4j組織的<code>dom4j</code>(最常用:如Spring)
JDom組織的<code>jdom</code>
JAXP是JavaSE的一部分,在<code>javax.xml.parsers</code>包下,分别針對dom與sax提供了如下解析器:
Dom
<code>DocumentBuilder</code>
<code>DocumentBuilderFactory</code>
SAX
<code>SAXParser</code>
<code>SAXParserFactory</code>
示例XML如下,下面我們會使用JAXP對他進行<code>增</code> <code>删</code> <code>改</code> <code>查</code>操作
config.xml
constraint.dtd
<code>DocumentBuilder</code>的<code>parse(String/File/InputSource/InputStream param)</code>方法可以将一個XML檔案解析為一個<code>Document</code>對象,代表整個文檔.
<code>Document</code>(<code>org.w3c.dom</code>包下)是一個接口,其父接口為<code>Node</code>, <code>Node</code>的其他子接口還有<code>Element</code> <code>Attr</code> <code>Text</code>等.
<code>Node</code>
<code>Node</code>常用方法
釋義
<code>Node appendChild(Node newChild)</code>
Adds the node newChild to the end of the list of children of this node.
<code>Node removeChild(Node oldChild)</code>
Removes the child node indicated by oldChild from the list of children, and returns it.
<code>NodeList getChildNodes()</code>
A NodeList that contains all children of this node.
<code>NamedNodeMap getAttributes()</code>
A NamedNodeMap containing the attributes of this node (if it is an Element) or null otherwise.
<code>String getTextContent()</code>
This attribute returns the text content of this node and its descendants.
<code>Document</code>
<code>Document</code>常用方法
<code>NodeList getElementsByTagName(String tagname)</code>
Returns a NodeList of all the Elements in document order with a given tag name and are contained in the document.
<code>Element createElement(String tagName)</code>
Creates an element of the type specified.
<code>Text createTextNode(String data)</code>
Creates a Text node given the specified string.
<code>Attr createAttribute(String name)</code>
Creates an Attr of the given name.
解析<code><bean/></code>标簽上的所有屬性
列印XML檔案所有标簽名
在第一個<code><bean/></code>标簽下添加一個<code><property/></code>标簽,最終結果形式:
注意: 必須将記憶體中的DOM寫回XML文檔才能生效
将剛剛添加的<code><property/></code>修改如下
删除剛剛修改的<code><property/></code>标簽
<code>SAXParser</code>執行個體需要從<code>SAXParserFactory</code>執行個體的<code>newSAXParser()</code>方法獲得, 用于解析XML檔案的<code>parse(String uri, DefaultHandler dh)</code>方法沒有傳回值,但比DOM方法多了一個事件處理器參數<code>DefaultHandler</code>:
解析到開始标簽,自動調用<code>DefaultHandler</code>的<code>startElement()</code>方法;
解析到标簽内容(文本),自動調用<code>DefaultHandler</code>的<code>characters()</code>方法;
解析到結束标簽,自動調用<code>DefaultHandler</code>的<code>endElement()</code>方法.
列印整個XML文檔
列印所有<code>property</code>标簽内容的<code>Handler</code>
注: SAX方式不能實作<code>增</code> <code>删</code> <code>改</code>操作.
Dom4j是JDom的一種智能分支,從原先的JDom組織中分離出來,提供了比JDom功能更加強大,性能更加卓越的Dom4j解析器(比如提供對XPath支援).
使用Dom4j需要在pom中添加如下依賴:
示例XML如下,下面我們會使用Dom4j對他進行<code>增</code> <code>删</code> <code>改</code> <code>查</code>操作:
context.xsd
與JAXP類似<code>Document</code>也是一個接口(<code>org.dom4j</code>包下),其父接口是<code>Node</code>, <code>Node</code>的子接口還有<code>Element</code> <code>Attribute</code> <code>Document</code> <code>Text</code> <code>CDATA</code> <code>Branch</code>等
<code>Element getParent()</code>
getParent returns the parent Element if this node supports the parent relationship or null if it is the root element or does not support the parent relationship.
<code>Element getRootElement()</code>
Returns the root Elementfor this document.
<code>Element</code>
<code>Element</code>常用方法
<code>void add(Attribute/Text param)</code>
Adds the given Attribute/Text to this element.
<code>Element addAttribute(String name, String value)</code>
Adds the attribute value of the given local name.
<code>Attribute attribute(int index)</code>
Returns the attribute at the specified indexGets the
<code>Attribute attribute(String name)</code>
Returns the attribute with the given name
<code>Element element(String name)</code>
Returns the first element for the given local name and any namespace.
<code>Iterator elementIterator()</code>
Returns an iterator over all this elements child elements.
<code>Iterator elementIterator(String name)</code>
Returns an iterator over the elements contained in this element which match the given local name and any namespace.
<code>List elements()</code>
Returns the elements contained in this element.
<code>List elements(String name)</code>
Returns the elements contained in this element with the given local name and any namespace.
<code>Branch</code>
<code>Branch</code>常用方法
<code>Element addElement(String name)</code>
Adds a new Element node with the given name to this branch and returns a reference to the new node.
<code>boolean remove(Node node)</code>
Removes the given Node if the node is an immediate child of this branch.
列印所有屬性資訊:
在第一個<code><bean/></code>标簽末尾添加<code><property/></code>标簽
我們可以将擷取讀寫XML操作封裝成一個工具, 以後調用時會友善些:
在第一個<code><bean/></code>的第一個<code><property/></code>後面添加一個<code><property/></code>标簽
将<code>id1</code> <code>bean</code>的第一個<code><property/></code>修改如下:
删除剛剛修改的節點
XPath是一門在XML文檔中查找資訊的語言,XPath可用來在XML文檔中對元素和屬性進行周遊.
表達式
描述
<code>/</code>
從根節點開始擷取(<code>/beans</code>:比對根下的<code><beans/></code>; <code>/beans/bean</code>:比對<code><beans/></code>下面的<code><bean/></code>)
<code>//</code>
從目前文檔中搜尋,而不用考慮它們的位置(<code>//property</code>: 比對目前文檔中所有<code><property/></code>)
<code>*</code>
比對任何元素節點(<code>/*</code>: 比對所有标簽)
<code>@</code>
比對屬性(例: <code>//@name</code>: 比對所有<code>name</code>屬性)
<code>[position]</code>
位置謂語比對(例: <code>//property[1]</code>: 比對第一個<code><property/></code>;<code>//property[last()]</code>: 比對最後一個<code><property/></code>)
<code>[@attr]</code>
屬性謂語比對(例: <code>//bean[@id]</code>: 比對所有帶id屬性的标簽; <code>//bean[@id='id1']</code>: 比對所有id屬性值為’id1’的标簽)
謂語: 謂語用來查找某個特定的節點或者包含某個指定的值的節點.
預設的情況下Dom4j并不支援XPath, 需要在pom下添加如下依賴:
Dom4j<code>Node</code>接口提供了方法對XPath支援:
方法
<code>List selectNodes(String xpathExpression)</code>
<code>List selectNodes(String xpathExpression, String comparisonXPathExpression)</code>
<code>List selectNodes(String xpathExpression, String comparisonXPathExpression, boolean removeDuplicates)</code>
<code>Object selectObject(String xpathExpression)</code>
<code>Node selectSingleNode(String xpathExpression)</code>
查詢所有<code>bean</code>标簽上的屬性值
删除id=”id2”的<code><bean/></code>
<dl></dl>
<dt>參考:</dt>