科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件XPath查询XML文档的注意事项

XPath查询XML文档的注意事项

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

正在建造的 XML 分类的主要目的是建立一个结构来集中存储我所拥有的书的信息,它应该足够灵活,可以进行查询和各种演示......

作者:佚名 来源:Microsoft 2007年11月5日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
标识危机

  在 XPath 中,没有直接确定节点标识或不同节点集合中的等效节点的构造。不直接支持比较,例如由 /bk:books 返回的节点是否与由 /bk:books/bk:book[1]/parent::* 返回的节点相同。在节点集合上使用 = 运算符的比较不将节点集合作为一个整体进行比较,而是使用“任意”语义。从 W3C XPath 建议:
“如果要比较的两个对象都是节点集合,则当且仅当第一个节点集合中有一个节点且第二个节点集合中有一个节点时,该比较才为 true,这样在两个节点的字符串值上进行比较的结果才为 true。”
  为了解释清楚这一点,以下是显示从简介的 XML 分类格式中执行有关节点集合比较操作结果的表格。请注意这些初看起来就象相互矛盾的结果。

表达式 结果 解释
//bk:book = /bk:books/bk:book[1] TRUE 是否 //bk:book 中至少有一个节点与 /bk:books/bk:book[1] 中的另一个节点具有同样的字符串值?
//bk:book != /bk:books/bk:book[1] TRUE 是否 //bk:book 中至少有一个节点与 /bk:books/bk:book[1] 中的另一个节点具有不同的字符串值?
not(//bk:book = /bk:books/bk:book[1]) FALSE 问题“是否//bk:book 中至少有一个节点与 /bk:books/bk:book[1] 中的另一个节点具有同样的字符串值?”的相反答案。

  可以使用 XPath count() 函数模仿节点标识,判断相同长度的两个节点集合的相交部分是否是任意节点集合的同样长度,或者在单一元素节点集合的情况下是否等于 1。例如,以下查询在这种情况下返回 TRUE,因为两个节点都是相同的。

  count(/bk:books | /bk:books/bk:book[1]/parent::*) = 1

  也可以使用 XSLT 中的 generate-id() 函数模仿节点标识。XSLT FAQ 提供使用 generate-id() 的示例。

  我是,故我在

  虽然没有测试节点存在的明确机制,但是它确实在涉及节点集合的一些表达式中隐式发生了。不存在的节点集合表示为空节点集合。在分别涉及字符串和数值操作的情况下,空节点集合隐式转换为空的字符串或 NaN。如果执行查询时没有查看实例文档,从而未确定空节点集合导致发生了(以及没有发生)哪些实例,系列隐式转换可能导致令人混淆的结果。下面是查询的一些示例,涉及空节点集合以及这些隐式转换如何影响它们。

表达式 结果
/NonExistentNode + 5 NaN
/NonExistentNode = 5 False
/NonExistentNode != 5 False
concat(/NonExistentNode, "hello") "hello"
/Root[@nonExistentAttribute] 不返回结果
/Root[@nonExistentAttribute < 5] 不返回结果
/Root[@nonExistentAttribute > 5] 不返回结果


  因为节点可能包含空的字符串,通常最好使用 boolean() 函数,而不是通过检查节点的字符串值来测试节点的存在。例如,以下查询(返回 FALSE)是肯定地告诉您文档中没有 NonExistentNode 的最好方法。   boolean(/NonExistentNode)

  命名空间和 XPath Redux

  在 XPath 中处理命名空间时的缺陷,这个缺陷涉及到即使文档使用默认的命名空间,也必须在表达式中映射前缀和命名空间名称。

  有趣的是对于一个文档,总有至少一个命名空间节点可以使用:XML 命名空间 http://www.w3.org/1998/namespace。例如,看看以下查询:

  /bk:books/namespace::*

  该查询将返回以下内容:

urn:xmlns:25hoursaday-com:my-bookshelf
http://www.w3.org/XML/1998/namespace  

  返回的项是 books.xml 文档根处提供的命名空间节点。

  未涉及的内容

  XML 文档中的某些信息是透明的,或者在某些情况下,对 XPath 是不可见的。XML 文档顶部的 XML 声明就是一种 XPath 看不到的 XML 构造。这意味着不能通过 XPath 来查询 XML 文档的版本、编码或独立状态。

  用于引入在分析 XML 文档的过程中替换的文本的语法构造(例如 CDATA 节和分析的实体)对 XPath 同样是透明的。XPath 将替换文本作为常规文本节点进行处理。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章