使用jdk的javax.xml.xpath.XPath 工具可定位XML文檔中某段特定的信息,而不需要使用DOM樹進行節點篩選。
XML示例:
<?xml version="1.0" encoding="UTF-8"?>
<!-- 此標籤的意思是 font標籤下包含name和size兩個標籤,可以使用正則,每個XML規則都用<!ELEMENT>標籤表示-->
<!DOCTYPE font[
<!ELEMENT font (name,size)>
]>
<font>
<part>
<name title="this is title">
<value>黑體</value>
<age>11</age>
</name>
<size>38</size>
<city>上海</city>
<fangxiang>東南</fangxiang>
</part>
<part>
<name>宋體</name>
<size>23</size>
</part>
<part>
<name>隸書</name>
<size>43</size>
</part>
</font>
XPath定位XML:
獲取某個標籤下所有的元素:
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 忽略標籤間的空白符
documentBuilderFactory.setIgnoringElementContentWhitespace(true);
DocumentBuilder documentBuilder=documentBuilderFactory.newDocumentBuilder();
Document document =documentBuilder.parse(new File("/work/xml.xml"));
XPathFactory xPathFactory= XPathFactory.newInstance();
XPath xPath =xPathFactory.newXPath();
NodeList nodeList=(NodeList)xPath.evaluate("/font/part",document, XPathConstants.NODESET);
//獲取根元素
Element rootElement =document.getDocumentElement();
//NodeList的item方法獲取每個Node元素
for (int i=0;i<nodeList.getLength();i++){
Node node= nodeList.item(i);
Element element=(Element) node;
//獲取標籤名
String tagName=element.getTagName();
//若確定該標籤下只有一個Text元素時直接調用getFirstChild方法即可
Text text =(Text)element.getFirstChild();
//獲取Text元素的值
String kk=text.getData().trim();
//獲取該標籤下所有標籤的所有文本,包括子標籤等所有下級標籤,只獲取標籤文本
String jj=element.getTextContent();
System.out.println("標籤名是:"+tagName);
System.out.println(kk);
System.out.println(jj);
}
獲取某個標籤下第一個元素標籤:
在所需標籤後面使用[]獲取,數字從1開始
Node nodeList=(Node)xPath.evaluate("/font/part[1]",document, XPathConstants.NODE);
獲取某標籤下元素標籤的數量:
count("表達式")
Number num=(Number)xPath.evaluate("count(/font/part)",document, XPathConstants.NUMBER);
獲取元素標籤的屬性值:
"表達式/@屬性值名稱"
String title=xPath.evaluate("/font/part[1]/name/@title",document, XPathConstants.STRING).toString();
System.out.println(title);