XPath

缘分一道桥

如果要定位某个XML文档中的一段特定信息,DOM解析方式过于麻烦,此时可用XPath

XPath可以描述XML文档中的一组节点

例如: /gridbag/row 描述了根元素gridbag的子元素中所有的row元素。

可以用[]操作符来选择特定元素:/gridbag/row[1] 这表示的是第一行(索引号从1开始)。

使用@操作符可以得到属性值。

XPath表达式:/gridbag/row[1]/cell[1]/@anchor 描述了第一行第一个单元格的anchor属性。

XPath表达式:/gridbag/row/cell/@anchor 描述了作为根元素gridbag子元素的那些行元素中所有单元格的anchor属性节点。

以下是代码演示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package xpath;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class Main {

public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub
File f=new File("fontdialog.xml");
DocumentBuilderFactory dfactory=DocumentBuilderFactory.newInstance();//DocumentBuilderFactory实例化
DocumentBuilder builder=dfactory.newDocumentBuilder();
Document doc=builder.parse(f);//用DOM方式指定XML文档对象
XPathFactory factory=XPathFactory.newInstance();
XPath path=factory.newXPath();
NodeList nodes=(NodeList)path.evaluate("/gridbag/row", doc,XPathConstants.NODESET);//获取/gridbag/row所有元素
System.out.println(nodes.getLength());
System.out.println((Number)path
.evaluate("count(/gridbag/row)", doc,
XPathConstants.NUMBER));//计算row节点的数量,注意row后面不要带斜杠
Node node=(Node)path.evaluate("/gridbag/row[1]/cell[1]/bean/class",
doc,XPathConstants.NODE);//获取特定子元素
String author=(String)path.evaluate("/gridbag/row[1]/cell[1]/@anchor", doc);//获取特定元素属性值
System.out.println(node.getNodeName());
System.out.println(author);
Node node1=(Node)path.evaluate("/gridbag/row[1]",
doc,XPathConstants.NODE);//获取特定子元素
String node2=path.evaluate("/row/cell[1]/@author", node1);
System.out.println("从任意一个节点开始,如"+node1.getNodeName()+"结果:"+node2);//测试失败!!
}

}

输出结果:

意外情况(方法已过时):

感觉xml相关类及接口置放位置很是混乱:

Donate comment here