XPath 是:使用路径表达式来选取 XML 文档中的节点或者节点集,其他有关概念请自己百度
我测试的环境是:WindowsXP、eclipse3.2、jdk1.6、dom4j1.6.1.jar、z-dom4j-1.4.jar
其中dom4j1.6.1.jar、z-dom4j-1.4.jar都可以在本人的资源库中进行下载,还有Dom4j的API,以及学习文档。
本页使用的xml文档是:
<?xml version="1.0" encoding="GBK"?>
<root name="根节点">
<book name="书" address="北京">
<title>
<titlechild name="书名:CS从入门到精通" address="地址:北京西城" author="马士兵">CS从入门到精通</titlechild>
<titlechild1 name="aCS从入门到精通titlechild1" address="a北京西城" author="a马士兵" price="37">aCS从入门到精通titlechild1</titlechild1>
<titlechild2 name="aCS从入门到精通titlechild2" address="a北京西城" author="a马士兵" price="37">aCS从入门到精通titlechild2</titlechild2>
</title>
<title>
<titlechild name="title2书名:CS从入门到精通" address="title2地址:北京西城" author="title2马士兵" price="35">title2CS从入门到精通
<titlechild name="title3书名:CS从入门到精通" address="title3地址:北京西城" author="title3马士兵" price="34">title3CS从入门到精通</titlechild>
</titlechild>
</title>
<author>
<authorchild name="书名:java从入门到精通" address="地址:上海虹桥" author="俞敏洪" price="36">候捷</authorchild>
</author>
<price>
<pricechild name="书名:oracle数据库入门" address="地址:西安东大街" author="王学胜" price="34">58.3</pricechild>
</price>
</book>
</root>
测试代码:
package org.dom4j.document_study_XPath;
import java.io.File;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;
public class Test_XPath {
public static void main(String[] args) {
readexml("C:\\1.xml");
}
//解析原始的xml
public static void readexml(String xmlpath){
SAXReader readxml = new SAXReader();
Document doc = null;
try {
doc = readxml.read(new File(xmlpath));//解析原始的xml
TestSelectSingleNode(doc);//通过XPath路径获取xml文档中第一个符合条件的节点
TestSelectNodes(doc);//通过节点的XPath路径获取document的某个节点的所有子节点
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 通过节点的XPath路径获取document的第一个节点名称是titlechild的节点
* @param document 一个Dom4j的Document对象
*/
public static void TestSelectSingleNode(Document document) {
Node node = document.selectSingleNode( "//titlechild" );//获取第一个titlechild节点
String name1 = document.selectSingleNode( "//titlechild").valueOf("@name");
String name = node.valueOf("@name");//选取节点node名字为name的属性值
String address = node.valueOf("@address");//选取节点node名字为address的属性值
String author = node.valueOf("@author");//选取节点node名字为author的属性值
System.out.println("node节点属性:\n name1=" + name1);
System.out.println("node节点属性:\n name=" + name + "\t address=" + address + "\t author=" + author );
}
/**运行结果:
* node节点属性:
name1=书名:CS从入门到精通
node节点属性:
name=书名:CS从入门到精通 address=地址:北京西城 author=马士兵
*/
/**
* 通过节点的XPath路径获取document当前的所有子节点
* @param document 一个Dom4j的Document对象
*/
@SuppressWarnings("unchecked")
public static void TestSelectNodes(Document document) {
List<Node> listnode =document.selectNodes("//.");//--------------------------
System.out.println("node节点:");
for(Node node : listnode){
if(node.getName()!=null){
System.out.println("节点名称name=" +node.getName() + "\t节点属性name" + node.valueOf("@name"));
}
}
}
/**运行结果:
* node节点:
节点名称name=file:///C:/1.xml 节点属性name
节点名称name=root 节点属性name根节点
节点名称name=book 节点属性name书
节点名称name=title 节点属性name
节点名称name=title 节点属性name
节点名称name=author 节点属性name
节点名称name=price 节点属性name
节点名称name=titlechild 节点属性name书名:CS从入门到精通
节点名称name=titlechild1 节点属性nameaCS从入门到精通titlechild1
节点名称name=titlechild2 节点属性nameaCS从入门到精通titlechild2
节点名称name=titlechild 节点属性nametitle2书名:CS从入门到精通
节点名称name=authorchild 节点属性name书名:java从入门到精通
节点名称name=pricechild 节点属性name书名:oracle数据库入门
节点名称name=titlechild 节点属性nametitle3书名:CS从入门到精通
*/
}