在Dom4j中使用Xpath搜索xml的元素节点

有关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 :[org.dom4j.tree.DefaultElement@d3c6a3 [Element: <学生 attributes: [org.dom4j.tree.DefaultAttribute@1961581 [Attribute: name 学号 value "1"]]/>]]
学生
姓名:张三
性别:男
年龄:20

对于xpath中的node(),它可以匹配任何类型的节点,使用它时会一并获得我们test.xml中的空白节点,不过它似乎只可以获得该元素下的子元素节点,子元素下的子元素就不会再去访问了,呵呵,说的有点饶人,语文不好。例如:

      List list =root.selectNodes("node()");	 
      System.out.println("list :"+list);

输出结果:

list :[org.dom4j.tree.DefaultText@15f7107 [Text: "
	"], org.dom4j.tree.DefaultElement@f593af [Element: <学生 attributes: [org.dom4j.tree.DefaultAttribute@1ee2c2c [Attribute: name 学号 value "1"]]/>], org.dom4j.tree.DefaultText@b2c6a6 [Text: "
	"], org.dom4j.tree.DefaultElement@10ffb38 [Element: <学生 attributes: [org.dom4j.tree.DefaultAttribute@1963b3e [Attribute: name 学号 value "2"]]/>], org.dom4j.tree.DefaultText@36527f [Text: "
	"], org.dom4j.tree.DefaultElement@6210fb [Element: <学生 attributes: [org.dom4j.tree.DefaultAttribute@b6548 [Attribute: name 学号 value "3"]]/>], org.dom4j.tree.DefaultText@48edb5 [Text: "
"]]


前面的例子我们都是一步一步,从上往下搜索的,其实利用Xpath,我们可以搜索任意的元素节点,不必考虑它在xml中的位置,这就是我们常说的绝对路径运算符"//",

      //获取学生下子元素为姓名且值为王五的元素
      List e= root.selectNodes("//学生[姓名='王五']"); 
      System.out.println(e);

输出结果:

[org.dom4j.tree.DefaultElement@6355dc [Element: <学生 attributes: [org.dom4j.tree.DefaultAttribute@1a85d38 [Attribute: name 学号 value "3"]]/>]]

结果输出有点难看,没有细致处理,但很直观,感兴趣的童鞋们可以自己处理下!掌握这些知识,相信可以处理简单的xml文档解析了!

posted on 2013-05-23 16:43  吴一达  阅读(305)  评论(0编辑  收藏  举报

导航