使用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);