有了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的困绕。
时间: 2024-10-07 05:26:34