xPath小结

有了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

xPath小结的相关文章

XML相关的安全漏洞-XXE,XPATH小结

0x00前言: 本文主要小结以下php下的xpath查询xml结构的漏洞利用和XXE漏洞利用 xml是可扩展标记语言,它被设计出来是为了存储传输数据的. 它的结构是树形结构,并且标签要成对出现比如下面这个例子 <?xml version="1.0" encoding="utf-8"?> <root> <name>sijidou</name> <from> <country>China</c

Xpath 小结

1. 如何通过xpath寻找不包含某个属性的节点 通过not关键字:比如寻找不包含style属性的节点: driver.findElement(By.xpath("./input[not(@style)]")); 2. 通过xpath搜特定节点之下的其他节点(xpath 的// 和.//) 如图需要搜索第二个<td>标签之下的table内容: Webment cell=driver.findElement(By.xpath("./td[@class='inv-pr

xpath定位方法小结(转载)

1.实例化一个浏览器WebDriver driver = new FirefoxDriver(); 2.driver.get() get传参数到浏览器中 3.常用定位方法webelement XX=driver.findElement(by.XX) 3.1 by.id("value");3.2 by.ame("value");3.3 by.xpath("/html/body/XX/div[1]/a") 表示第一个div值为a的值      by.

php操作xml小结

<?php #php操作xml,SimpleXMLElement类小结 header('Content-type:text/html;charset=utf-8;'); //1.构造函数 /* $xmlstring=<<<XML <?xml version="1.0" encoding="utf-8"?> <note  xmlns:b="http://www.w3school.com.cn/example/&quo

一个WPF小项目小结

一:缘起 在10月中旬的时候在学校BBS上看到有人有做PC桌面客户端的需求,做的是能耗的计算和评估,要算能耗,就有很多环节,最后对这些环节数据进行一些简单计算.我想要是做的话就用比较熟的wpf,就去聊了下,对方给了1张比较复杂的Excel表格(其实对方的需求并不是很清楚,最后大概10来张EXcel表格),说是要做成软件呈现的形式,也没要求数据库,反正只要有功能,界面他们也没概念,给了个98年的老软件作为参考,最后EXcel表格弄懂结构后不复杂,计算都是加减乘除.我就答应了,这个软件算起来大概花了

C#编程(六十八)----------LINQ小结

LINQ小结 一.LINQ是什么 LINQ也就是Language Interrated Query的缩写,怎么一个缩写法我也不明白,即语言集成查询,是微软在.NET3.5中提出的一项新技术,LINQ主要包含四个组件,下面看一下LINQ的一个架构图: 简单的介绍一些四个组件: 1.Linq to SQL 组件----可以查询基于关于数据的数据(微软本身只是实现了对SQL Server的查询,可以对数据库中的数据进行查询,修改,插入删除,排序等操作) 2.LINQ to Dataset组件----可

自动化测试Selenium Webdriver (JAVA)学习小结

自动化测试--Selenium学习小结 一.自动化测试的概念及意义: 1.什么是自动化测试: 一般是指软件测试的自动化,软件测试就是在预设条件下运行系统或应用程序,评估运行结果,预先条件应包括正常条件和异常条件. 2.意义: 让测试更有效率,利用更多的空余时间,减少人力资源. 二.selenium工具 我用的是java语言,所以接下来的例子和方法都是基于java的. 1.环境配置 (1)Jdk的配置: 我用的是1.7的jdk,配置方法都一样,新建一个JAVA_HOME,把你装好的jdk的路径复制

C#高级编程六十八天---LINQ小结

LINQ小结 一.LINQ是什么 LINQ也就是Language Interrated Query的缩写,怎么一个缩写法我也不明白,即语言集成查询,是微软在.NET3.5中提出的一项新技术,LINQ主要包含四个组件,下面看一下LINQ的一个架构图: 简单的介绍一些四个组件: 1.Linq to SQL 组件----可以查询基于关于数据的数据(微软本身只是实现了对SQL Server的查询,可以对数据库中的数据进行查询,修改,插入删除,排序等操作) 2.LINQ to Dataset组件----可

Windows环境下libxml2库的使用小结

(1)--环境的搭建,下载与安装LIBXML2和ICONV Libxml2是一个C语言的XML程序库,可以简单方便的提供对XML文档的各种操作,并且支持XPATH查询,以及部分的支持XSLT转换等功能.Libxml2的下载地址是http://xmlsoft.org/downloads.html,完全版的库是开源的,并且带有例子程序和说明文档.完全版的文件名为:libxml2-2.7.8.tar.gz. Libxml2中默认的内码是UTF-8,所有使用libxml2进行处理的xml文件,必须首先显