有了XML数据的描述标准,人们自然就会想到应该有一种查询语言可以在XML中查找任意节点的数据,就像SQL语句可以在关系性数据库中执行查询操作一样,于是XQUERY和XPATH顺应潮流,应运而生。由于XQUERY较为复杂,使用不甚方便,XPATH渐渐成为主流。xPath 是一个 W3C 标准, 它 是 XSLT 中的主要元素,包含一个标准函数库,使用路径表达式在 XML 文档中进行导航。
XPATH遵循文档对象模型(DOM)的路径格式,由于每个XML文档都可以看成是一棵拥有许多结点的树,每个结点可以是以下七个类型之一:根(root)、元素(element)、属性(attribute)、正文(text)、命名空间(namespace)、处理指令(processing instruction)和注释(comment)。
XPATH的基本语法由表达式构成。在计算表达式的值之后产生一个对象,这种对象有以下四种基本类型:节点集合、布尔型、数字型和字符串型 。
采用xpath查找需要引入jaxen-xx-xx.jar,否则会java.lang.NoClassDefFoundError:org/jaxen/JaxenException异常。
下面是我做的一些基础知识整理:
(一)常见的路径表达式
(二)常见谓语的一些路径表达式
(1) 索引某特定条件的元素,如下:
(2) 选择特定属性的元素
(3) 元素值在某范围的元素
(三)选取未知节点
(四)运算符
(五)代码测试
(1)xPath.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<A id="a1">
<B id="b1">
<C id="c1" name="ccc">
<G id="g1">
<B name="b"/>
<D id="d1"/>
<E id="e1"/>
<E id="e2"/>
</G>
</C>
</B>
<B id="b2"/>
<C id="c2">
<B/>
<D id="d2"/>
<F/>
</C>
<E/>
</A>
(2)java代码文件
package xPath;
import java.io.File;
import java.io.InputStream;
import java.util.Iterator;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
/**
* xpath查询xml节点测试
* @author lsh
*
*/
public class xPath {
public static void main(String[] args){
File file = new File("src/xpathTest.xml");
SAXReader reader = new SAXReader();
try {
Document doc = reader.read(file);
//表达式路径:nodename; 结果:选取nodename元素的所有子元素
Element xpathElt =(Element)doc.selectSingleNode("A");
for (Iterator i =xpathElt.elementIterator();i.hasNext();) {
Element element =(Element)i.next();
System.out.println("显示: " + element.getName() );
}
System.out.println("____________(一)___________________");
//表达式路径:/rootname; 结果:选取rootname根元素
Element xpathElt1 =(Element)doc.selectSingleNode("/A");
String elemName =xpathElt1.attributeValue("id");
System.out.println(elemName);
System.out.println("____________(二)___________________");
//表达式路径:nodename/childname; 结果:选取nodename下名字为childname的所有子元素。
Element xpathElt2 =(Element)doc.selectSingleNode("A/C");
for (Iterator i =xpathElt2.elementIterator();i.hasNext();) {
Element element =(Element)i.next();
System.out.println("显示: " + element.getName() );
}
System.out.println("_____________(三)__________________");
//表达式路径://childname; 结果:选取所有childname子元素,而不管它们在文档中的位置
Element xpathElt3 =(Element)doc.selectSingleNode("//C");
for (Iterator i =xpathElt3.elementIterator();i.hasNext();) {
Element element =(Element)i.next();
System.out.println("显示: " + element.getName() );
}
System.out.println("______________(四)_________________");
//表达式路径:nodename//childname; 结果:选取nodename下名字为 childname的所有后代元素,而不管它们位于 bookstore 之下的什么位置
Element xpathElt4 =(Element)doc.selectSingleNode("A//B");
for (Iterator i =xpathElt4.elementIterator();i.hasNext();) {
Element element =(Element)i.next();
System.out.println("显示: " + element.getName() );
}
System.out.println("_______________(五)________________");
//表达式路径://@childname; 结果:选取所有名为 childname的属性
List list =doc.selectNodes("//@name");
Iterator iter = list.iterator();
while (iter.hasNext()) {
Attribute attribute = (Attribute) iter.next();
System.out.println(attribute.getValue());
}
System.out.println("________________(六)_______________");
//查找C元素下属性id=‘c2’的特定C元素
Element xpathElt5 =(Element)doc.selectSingleNode("//C[@id='c2']");
System.out.println(xpathElt5.getName());
System.out.println("__________________(七)_____________");
} catch (Exception e) {
e.printStackTrace();
}
}
}
(3)测试结果
总之,因为xPath使用路径表达式查询XML中查找任意节点的数据,给我们带来了方便,大大解除了我们解析XML的困绕。