`
berdy
  • 浏览: 513681 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

使用xpath提取xml中的节点信息

阅读更多
    类似于使用SQL从数据库从查询数据。XPath可以方便的在XML 文档中查找信息的语言,并在XML文档中对元素和属性进行遍历。XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。
    虽然有很强的表达能力,XPath 并不是 Java 语言,事实上 XPath 不是一种完整的编程语言。有很多东西用 XPath 表达不出来,甚至有些查询也无法表达。幸运的是,可以把 XPath 结合到 Java 程序中,这样就能发挥两者的优势了:Java 做 Java 所擅长的,XPath 做 XPath 所擅长的。
    在最初,Java 程序执行 XPath 查询所需要的应用程序编程接口(API)因形形色色的 XPath 引擎而各不相同。Xalan 有一种 API,Saxon 使用另一种,其他引擎则使用其他的 API。这意味着代码往往把您限制到一种产品上。最好能够试验具有不同性能特点的各种引擎,而不会带来不适当的麻烦或者重新编写代码。
    幸运的是Java 5 推出了 javax.xml.xpath 包,提供一个引擎和对象模型独立的 XPath 库。这个包也可用于 Java 1.3 及以后的版本,但需要单独安装 Java API for XML Processing (JAXP) 1.3。Xalan 2.7 和 Saxon 8 以及其他产品包含了这个库的实现。

这里先简单介绍下xpath的基本语法,后面再举详细的例子。节点选取语法:

节点路径表达式:
表达式描述
nodename选取此节点的所有子节点
/从根节点选取
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
.选取当前节点
..选取当前节点的父节点
@选取属性


谓词(用来查找某个特定的节点或者包含某个指定的值的节点,通常使用在[]内)
路径表达式结果
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3]选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang]选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng']选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00]选取所有 bookstore 元素的 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title选取所有 bookstore 元素中的 book 元素的 title 元素,且其中的 price 元素的值须大于 35.00。

节点通配符:
通配符描述
*匹配任何元素节点
@*匹配任何属性节点
node()匹配任何类型的节点

路径组合表达式,组合多个路径表达式,扩大选择范围;例如:
//book/title | //book/price 选取所有 book 元素的 title 和 price 元素。

另外,关于xpath的轴和运算符这里就不再细说了,有兴趣的可以参看后面的参看资料。
下面给出一个实例,展示如何在java中使用xpath提取xml中的信息
xml文件test.xml的内容:
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
	<book category="COOKING">
		<title lang="en">Everyday Italian</title>
		<author>Giada De Laurentiis</author>
		<year>2005</year>
		<price>30.00</price>
	</book>
	<book category="CHILDREN">
		<title lang="en">Harry Potter</title>
		<author>J K. Rowling</author>
		<year>2005</year>
		<price>29.99</price>
	</book>
	<book category="WEB">
		<title lang="en">XQuery Kick Start</title>
		<author>James McGovern</author>
		<author>Per Bothner</author>
		<author>Kurt Cagle</author>
		<author>James Linn</author>
		<author>Vaidyanathan Nagarajan</author>
		<year>2003</year>
		<price>49.99</price>
	</book>
	<book category="WEB">
		<title lang="zh">Learning XML</title>
		<author>Erik T. Ray</author>
		<year>2003</year>
		<price>39.95</price>
	</book>
</bookstore>

提取xml文件中节点信息的java代码:
/**
 * "/"表示绝对路径 <br/>
 * "/AA" 所有根节点AA<br/>
 * "/AA/BB" 所有根节点下的所有BB节点<br/>
 * 
 * "//" 表示相对路径<br/>
 * "//BBB" 表示所有的名字为BBB的节点<br/>
 * "//DDD/BBB" 表示所有父节点为DDD的BBB节点<br/>
 * 
 * "*" 表示选择所有由星号之前的路径所定位的元素<br/>
 * "/AAA/CCC/DDD/*" 选择所有路径依附于/AAA/CCC/DDD的元素<br/>
 * "//*" 选择所有元素
 * 
 * "/AAA/BBB[1]" 选择AAA的第一个BBB子元素<br/>
 * "/AAA/BBB[last()]" 选择AAA的最后一个BBB子元素<br/>
 * 
 * "//@id" 选择所有的id属性<br/>
 * "//BBB[@id]" 选择有id属性的BBB元素<br/>
 * "//BBB[@name]" 选择有name属性的BBB元素<br/>
 * "//BBB[@*]" 选择有任意属性的BBB元素<br/>
 * "//BBB[not(@*)]" 选择没有属性的BBB元素<br/>
 * 
 * "//BBB[@id='b1']" 选择含有属性id且其值为'b1'的BBB元素<br/>
 * "//BBB[@name='bbb']" 选择含有属性name且其值为'bbb'的BBB元素<br/>
 * "//BBB[normalize-space(@name)='bbb']"
 * 选择含有属性name且其值(在用normalize-space函数去掉前后空格后)为'bbb'的BBB元素<br/>
 * 
 * "//*[count(BBB)=2]" 选择含有2个BBB子元素的元素<br/>
 * "//*[count(*)=2]" 选择含有2个子元素的元素<br/>
 * "//*[name()='BBB']" 选择所有名称为BBB的元素(这里等价于//BBB)<br/>
 * "//*[starts-with(name(),'B')]" 选择所有名称以"B"起始的元素<br/>
 * "//*[contains(name(),'C')]" 选择所有名称包含"C"的元素<br/>
 * 
 * "//CCC | //BBB" 选择所有的CCC和BBB元素<br/>
 * "/AAA/EEE | //BBB" 选择所有的BBB元素和所有是AAA的子元素的EEE元素<br/>
 */

InputSource inputSource = new InputSource(new FileInputStream("test.xml"));
XPathFactory factory = XPathFactory.newInstance();
XPath xPath = factory.newXPath();
XPathExpression expression = xPath.compile("//book/title[@lang=\"en\"]");
NodeList list = (NodeList) expression.evaluate(inputSource, XPathConstants.NODESET);
for (int i = 0; i < list.getLength(); i++) {
	Node node = list.item(i);
	System.out.println(node.getNodeName());
}

解析的步骤如下:
1、获取xml文件
InputSource inputSource = new InputSource(new FileInputStream("test.xml"));
//或者使用DOM解析
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("test.xml");

2、接下来创建 XPathFactory:
XPathFactory factory = XPathFactory.newInstance();

3、然后使用这个工厂创建 XPath 对象:
XPath xPath = factory.newXPath();

4、使用XPath 对象编译 XPath 表达式:
XPathExpression expression = xPath.compile("//book/title[@lang=\"en\"]");

5、使用表达式的evaluate(),并处理结果:
NodeList list = (NodeList) expression.evaluate(inputSource, XPathConstants.NODESET);
for (int i = 0; i < list.getLength(); i++) {
	Node node = list.item(i);
	System.out.println(node.getNodeName());
}

evaluate() 方法被声明为返回 Object。实际返回什么依赖于 XPath 表达式的结果以及要求的类型。一般来说,XPath 的
number 映射为 java.lang.Double
string 映射为 java.lang.String
boolean 映射为 java.lang.Boolean
node-set 映射为 org.w3c.dom.NodeList

在 Java 中计算 XPath 表达式时,第二个参数指定需要的返回类型。有五种可能,都在 javax.xml.xpath.XPathConstants 类中命名了常量:
XPathConstants.NODESET
XPathConstants.BOOLEAN
XPathConstants.NUMBER
XPathConstants.STRING
XPathConstants.NODE

    在使用xpath解析xml的时候还有很多需要注意的地方,若 XML 文档中的元素在名称空间中,查询该文档的 XPath 表达式必须使用相同的名称空间。XPath 表达式不一定要使用相同的前缀,只需要名称空间 URI 相同即可。事实上,如果 XML 文档使用默认名称空间,那么尽管目标文档没有使用前缀,XPath 表达式也必须使用前缀。另外我们也还可以在java中扩展xpath的函数。更多信息请参看下面的参考资料。

参考资料:
Java 语言的 XPath API
Working XML: Get started with XPath 2.0
XPath 教程


1
0
分享到:
评论

相关推荐

    Java中使用xpath获取xml中的数据

    在实际应用中,可以根据需求灵活地构造XPath表达式,以高效地提取XML文档中的信息。记住,XPath是XML处理中的强大工具,合理使用能大大提高开发效率。在处理大型XML文档时,使用XPath配合Java进行数据提取,可以避免...

    用XPath 表达式从 XML 文档中提取信息

    XPath表达式是用于定位这些节点的语句,它们允许开发者高效地从复杂的XML数据结构中提取所需信息。 在XML文档中,每个元素、属性和文本都有一个唯一的路径,XPath就是通过这个路径来找到它们。XPath使用路径表达式...

    如何使用XPath提取xml文档数据

    在本文中,我们将详细介绍如何使用XPath提取XML文档数据,包括基本语法、节点选择、轴选择、谓词选择等方面的内容。 XPath基础 XPath是一种路径语言,用于在XML文档中定位和选择节点。它由W3C组织制定的,旨在提供...

    Xpath 解析xml文件转化为csv文件

    XPath是一种在XML文档中查找信息的语言,它是XML处理中的重要工具。XML(eXtensible Markup Language)是一种标记语言,常用于数据交换和存储。CSV(Comma Separated Values)文件则是一种简单、通用的数据格式,...

    xpath解析xml

    XPath,全称XML Path Language,是一种在XML文档中查找信息的语言。它被设计用来选取XML文档中的节点,如元素、属性、文本等。XPath基于XPath 1.0规范,但随着技术发展,也有XPath 2.0和3.1等更新版本。在本篇文章中...

    从XML文件抽出XPath - C and C++

    在这个主题中,我们将深入探讨如何在C和C++中使用XPath来解析XML文件。 首先,让我们了解C++中处理XML文件的基本步骤。C++中常用的库有TinyXML和pugixml,这两个库都提供了解析XML文档的功能。在提供的文件`get_...

    用xpath精确定位节点元素

    XPath在XSLT(Extensible Stylesheet Language Transformations)中扮演着核心角色,因为它允许用户基于XML文档的结构来选择节点,这对于数据转换和提取是至关重要的。 #### XPath数据类型 XPath支持四种主要的...

    B06_1_Xpath提取网页数据.md

    ### Xpath提取网页数据知识点详解 #### 一、Xpath简介 Xpath是一种查询语言,主要用于在XML文档中查找信息。它可以轻松地在XML文档中通过元素和属性进行导航。虽然Xpath最初是为了处理XML而设计的,但它同样适用于...

    mybatis入门之xpath解析xml

    在MyBatis中,XPath被广泛用于从XML配置文件中提取SQL语句和参数映射等信息。 XPath的工作原理基于节点树模型,XML文档被视为一棵由节点组成的树,包括元素节点、属性节点、文本节点等。XPath提供了一系列的路径...

    对Xpath 获取子标签下所有文本的方法详解

    XPath,全称XML Path Language,是一种在XML文档中查找信息的语言。它被广泛应用于Web抓取,特别是Python的Scrapy框架中,用于选取XML或HTML文档中的节点。本文将深入探讨如何使用XPath来获取子标签下的所有文本内容...

    JsonPath使用类似XPATH的语法从JSON提取数据

    JsonPath是一种用于从JSON文档中提取数据的语言,其语法与XPath在XML文档中的操作非常相似。XPath是XML处理中常用的一种路径表达式语言,而JsonPath则是为JSON数据设计的查询语言。在Java开发中,处理JSON格式的数据...

    google-xpath提取器插件

    标题中的“google-xpath提取器插件”是指一个专门用于网页元素XPath路径提取的工具,它可以帮助用户方便地从Google浏览器中获取XML Path Language(XPath)表达式。XPath是一种在XML文档中查找信息的语言,常用于...

    PB解析xml指定路径的节点内容

    标题中的“PB”指的是PowerBuilder,一款经典的面向对象的编程工具,主要用于开发企业级的应用程序。...通过参考示例代码,开发者可以学习到如何根据XPath定位XML节点,并从中提取所需信息,提升他们的编程技能。

    Xpath读取xml文件,实现文件缓存。

    XPath是XML文档遍历和数据提取的重要工具,它允许我们以简洁的方式定位XML文档中的元素、属性和其他节点。在这个场景中,“Xpath读取xml文件,实现文件缓存”指的是利用XPath来高效地检索XML数据,并通过缓存机制...

    xml解析例子得到各个节点信息

    在Java中,解析XML文件是常见的任务,这通常涉及到提取XML文档中的节点信息和属性。以下是一些关于XML解析的重要知识点: 1. **DOM解析器**: DOM(文档对象模型)解析器将整个XML文档加载到内存中,形成一个树形...

    java xml xpath介绍

    Java XML XPath 是一种在XML文档中查找信息的语言,它被广泛用于Java开发中,以便高效地提取和操作XML数据。XPath使用路径表达式来选取XML文档中的节点或节点集,这些表达式类似于文件系统的路径,但针对的是XML文档...

    XmlDocument 节点遍历C#

    总的来说,`XmlDocument`类提供了强大而灵活的功能来处理XML文档,通过遍历其节点,我们可以轻松地提取和操作XML数据。在实际开发中,根据具体需求,可以结合XPath或LINQ to XML等更高级的技术进行更复杂的查询和...

    XPath 为 xml查询语言,方便xml遍历,简化xml操作。

    XPath(XML Path Language)是一种用于在XML文档中查找信息的语言,它提供了简便的方式来遍历XML文档结构并提取所需数据。XPath基于XML文档的树状结构,通过路径表达式来定位XML文档中的节点,包括元素、属性、文本...

Global site tag (gtag.js) - Google Analytics