用dom4j对xml进行解析已经比sax方式简洁了很多,用起来很方便,但是在获取某个元素时依然有点麻烦,要一层一层的获取,这样很麻烦,换好dom4j提供了对XPATH的支持,这里简单介绍一下。
以下面这个xml文件为例:
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1 id="111">
<name>zhangsan</name>
<age>40</age>
<sex>nv</sex>
</p1>
<p1 id="222">
<name>lisi</name>
<age>21</age>
</p1>
<p1 id="333">
<name>wangwu</name>
<age>20</age>
</p1>
</person>
比如我现在想获取p1属性id值为222的元素下面的name元素,如果用dom4j,首先要获取根节点person,然后获取根节点下面的第二个p1元素,最后获取p1下面的name元素,这样操作起来很繁琐,如果xml文件很复杂,这样操作就会相当复杂。如果用XPATH将会很方便,代码如下:
public static void getFirstName() throws Exception{
Document doc = Dom4jUtils.getDocument();
Node name1 = doc.selectSingleNode("//p1[@id='111']/name");
System.out.println("name="+name1.getText());
}
代码中获取document对象的代码我封装在了一个类中,这里不再给出,重点是看获取元素部分代码。大家会发现在获取元素时只调用了一个方法,方法里有一个特殊的字符串,下面给出六种最常用的形式:
/AAA/DDD/BBB | 表示AAA下面的DDD下面的BBB元素 |
//BBB | 表示得到所有的BBB元素 |
/* | 表示得到所有元素 |
BBB[1],BBB[last()] | 分别表示第一个BBB元素和最后一个BBB元素 |
//BBB[@id] | 表示得到所有有id属性的BBB元素 |
//BBB[@id=’aaa’] | 表示得到属性值是aaa的BBB元素 |
下面再给出一个例子:
得到所有的name元素
public static void getAllName() throws Exception{
Document doc = Dom4jUtils.getDocument();
List<Node> names = doc.selectNodes("//name");
for(Node name:names) {
String s = name.getText();
System.out.println("name="+s);
}
}
xpath用起来非常方便,这里只做简单介绍,更详细的内容请参考其它博文。