有关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文档解析了!