有关XPath的知识,大家可以参考我的xml小结里面的《通过Xpath查找指定节点》一文,在本文中我们继续使用test,xml来作为解析的范例!为了方便起见,我就直接把源码附在下面了!
<?xml version="1.0" encoding="utf-8"?>
<学生名册 >
<学生 学号="1">
<姓名>张三</姓名>
<性别>男</性别>
<年龄>20</年龄>
</学生>
<学生 学号="2">
<姓名>李四</姓名>
<性别>女</性别>
<年龄>19</年龄>
</学生>
<学生 学号="3" >
<姓名>王五</姓名>
<性别>男</性别>
<年龄>21</年龄>
</学生>
</学生名册>
和上次一样,来读取xml,获取它的Document对象。
SAXReader saxReader=new SAXReader();
Document document=saxReader.read(new File("test.xml"));
Element root=document.getRootElement();
System.out.println(root.getName());
实例:选取学生名册下子元素为学生,且该子元素属性是学号=1的节点,然后我们获取该子元素节点下面的元素.
List list =document.selectNodes("/学生名册/学生[@学号='1']");
System.out.println("list :"+list);
for(Iterator iterator=list.iterator();iterator.hasNext();){
Element e=(Element)iterator.next();
System.out.println(e.getName());
for (Iterator it=e.elementIterator();it.hasNext();){
Element subElement=(Element)it.next();
System.out.println(subElement.getName()+":"+subElement.getText());
}
}
输出结果:
学生名册
list :[[email protected] [Element: <学生 attributes: [[email protected] [Attribute: name 学号 value "1"]]/>]]
学生
姓名:张三
性别:男
年龄:20
对于xpath中的node(),它可以匹配任何类型的节点,使用它时会一并获得我们test.xml中的空白节点,不过它似乎只可以获得该元素下的子元素节点,子元素下的子元素就不会再去访问了,呵呵,说的有点饶人,语文不好。例如:
List list =root.selectNodes("node()");
System.out.println("list :"+list);
输出结果:
list :[[email protected] [Text: "
"], [email protected] [Element: <学生 attributes: [[email protected] [Attribute: name 学号 value "1"]]/>], [email protected] [Text: "
"], [email protected] [Element: <学生 attributes: [[email protected] [Attribute: name 学号 value "2"]]/>], [email protected] [Text: "
"], [email protected] [Element: <学生 attributes: [[email protected] [Attribute: name 学号 value "3"]]/>], [email protected] [Text: "
"]]
前面的例子我们都是一步一步,从上往下搜索的,其实利用Xpath,我们可以搜索任意的元素节点,不必考虑它在xml中的位置,这就是我们常说的绝对路径运算符"//",
//获取学生下子元素为姓名且值为王五的元素
List e= root.selectNodes("//学生[姓名='王五']");
System.out.println(e);
输出结果:
[[email protected] [Element: <学生 attributes: [[email protected] [Attribute: name 学号 value "3"]]/>]]
结果输出有点难看,没有细致处理,但很直观,感兴趣的童鞋们可以自己处理下!掌握这些知识,相信可以处理简单的xml文档解析了!