天天看點

Java 解析 XML Java 解析 XML

标簽: 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>&lt;bean/&gt;</code>标簽上的所有屬性

列印XML檔案所有标簽名

在第一個<code>&lt;bean/&gt;</code>标簽下添加一個<code>&lt;property/&gt;</code>标簽,最終結果形式:

注意: 必須将記憶體中的DOM寫回XML文檔才能生效

将剛剛添加的<code>&lt;property/&gt;</code>修改如下

删除剛剛修改的<code>&lt;property/&gt;</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>&lt;bean/&gt;</code>标簽末尾添加<code>&lt;property/&gt;</code>标簽

我們可以将擷取讀寫XML操作封裝成一個工具, 以後調用時會友善些:

在第一個<code>&lt;bean/&gt;</code>的第一個<code>&lt;property/&gt;</code>後面添加一個<code>&lt;property/&gt;</code>标簽

将<code>id1</code> <code>bean</code>的第一個<code>&lt;property/&gt;</code>修改如下:

删除剛剛修改的節點

XPath是一門在XML文檔中查找資訊的語言,XPath可用來在XML文檔中對元素和屬性進行周遊.

表達式

描述

<code>/</code>

從根節點開始擷取(<code>/beans</code>:比對根下的<code>&lt;beans/&gt;</code>; <code>/beans/bean</code>:比對<code>&lt;beans/&gt;</code>下面的<code>&lt;bean/&gt;</code>)

<code>//</code>

從目前文檔中搜尋,而不用考慮它們的位置(<code>//property</code>: 比對目前文檔中所有<code>&lt;property/&gt;</code>)

<code>*</code>

比對任何元素節點(<code>/*</code>: 比對所有标簽)

<code>@</code>

比對屬性(例: <code>//@name</code>: 比對所有<code>name</code>屬性)

<code>[position]</code>

位置謂語比對(例: <code>//property[1]</code>: 比對第一個<code>&lt;property/&gt;</code>;<code>//property[last()]</code>: 比對最後一個<code>&lt;property/&gt;</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>&lt;bean/&gt;</code>

<dl></dl>

<dt>參考:</dt>