使用XPATH,如何选择包含特定字符串的任何节点

2024-03-20

假设我有一个如下所示的 XML 文件:

<books>
  <book>
    <title>John is alive</title>
    <abstract>
        A man is found alive after having disappeared for 10 years.
    </abstract>
    <description>
        <en> John disappeared 10 years ago. Lorem ipsum dolor sit amet ...</en>
        <fr> Il y a 10 ans, John disparaissait. Lorem ipsum dolor sit amet ...</fr>
    </description>
    <notes>First book in the series, where the character is introduced</notes>
  </book>
  <book>
    <title>The disappearance of John</title>
    <abstract>
        A prequel to the book "John is alive".
    </abstract>
    <description>
        <en> He lead an ordinary life, but then ... lorem ipsum dolor sit amet ...</en>
        <fr> Sa vie était tout à fait ordinaire, mais ... lorem ipsum dolor sit amet ...</fr>
    </description>
    <notes>Second book in the "John" series, but first in chronological order</notes>
  </book>
</books>

我的问题很简单:我如何使用 XPATH 获取包含该单词的所有节点的集合John?

显然,我可以指定一系列节点并且效果很好:

(//title | //abstract | //description/* | //notes)[contains(lower-case(text()),"john")]

但是,如果我的 XML 增长(而且它会增长!),并且在结构的各个级别添加新元素,我不想经常返回并调整我的 XPATH。

我不明白的是为什么像这样的通用声明

//*[contains(lower-case(text()),"john")]

失败并显示此错误消息Required cardinality of first argument of lower-case() is one or zero.

然而,并非所有带星号的语句都会失败。

例如:

//books/book/*[contains(lower-case(text()),"john")]失败并显示上述错误消息

while

//books/book/*/*[contains(lower-case(text()),"john")]成功并检索到<en> and <fr>从第一个节点开始<description> element

如果不可能,好吧,我将列出 XPATH 中的所有元素,但我仍然想清楚地了解*a 上下文中的选择器contains()手术。


该术语存在一些歧义nodes (see child::* 和 child::node() 之间的 XPath 差异 https://stackoverflow.com/q/52045856/290085)和术语contains (see 如何对特定文本使用 XPath contains() ? https://stackoverflow.com/q/39650007/290085)当不够精确时,但以下 XPath 之一可能会满足您的需求:

  1. All nodes whose 字符串值 https://www.w3.org/TR/1999/REC-xpath-19991116/#dt-string-value包含子字符串,"John":

    //node()[contains(.,"John")]
    
  2. 凡此种种elements:

    //*[contains(.,"John")]
    
  3. 凡此种种属性:

    //@*[contains(.,"John")]
    
  4. 凡此种种文本节点:

    //text()[contains(.,"John")]
    
  5. All elements带有包含子字符串的文本节点子节点,"John":

    //*[text()[contains(.,"John")]]
    

请注意,#1 将包括books,但#5 将排除它。看在 XPath 中测试 text() 节点与字符串值 https://stackoverflow.com/q/34593753/290085.

您可以更换contains(.,"John") with contains(lower-case(.),"john")如果您使用的是 XPath 2.0,请在上述任何 XPath 中。也可以看看不区分大小写的 XPath contains() 可能吗? https://stackoverflow.com/q/8474031/290085

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用XPATH,如何选择包含特定字符串的任何节点 的相关文章

随机推荐

  • Htaccess - 重定向除一个网址之外的所有网址

    我正在尝试将所有网址从一个域重定向到另一个域 但一个 某种 这是我必须重定向的 htaccess 除了域之外 都保持相同的 url 例如 domain com something 转到domain2 com something Rewrit
  • boost C++ 无锁队列与共享队列

    我对多线程编程很陌生 我只知道最常见的生产者 消费者 队列 我正在使用 boost c 库 我不知道是否更好地使用 boost lockfree queue 或使用 mutex 和 condition variable 的 std queu
  • Me 关键字的行为不一致

    我注意到的行为MeVBA 代码中的关键字模板文件根据文档是否具有 ActiveX 控件而有所不同 带有 ActiveX 控件的文档 Me引用从模板创建的新文件 没有 ActiveX 控件的文档 Me引用模板而不是新文件 为了演示这种奇怪的行
  • Windows 控制台中的希腊字母

    我正在用 C 编写一个程序 当我在 cmd exe 中运行它时 我希望在菜单中包含希腊字符 有人说 为了包含希腊字符 你必须使用printf事情是这样的 printf charset IS0 1089 uffe 但他们不确定 有谁知道这是怎
  • 西里尔字母验证

    今天我遇到了一个有趣的缺陷 问题是我在俄罗斯部署了我的 Web 应用程序 并且名称值 在下面的方法中没有返回 true 作为字母数字 很好奇人们如何解决这样的问题 邓肯 private boolean isAlphaNumeric Stri
  • 在长按手势识别器上获取错误的 UIButton 标签

    我知道已经有很多类似的问题被问到 但我已经尝试了所有这些问题 并且在未能解决我的问题时我发布了我的问题 首先我尝试的问题是 1 如何通过longPressGestureRecognizer获取button tag https stackov
  • 将自签名 XAP 部署到 Windows Phone 8

    我们为 WP8 开发了一个应用程序 并希望通过 XAP 文件的下载 URL 在内部分发它 到目前为止我们已采取的步骤 使用Makecert exe生成带有XXX pvk的自签名XXX cer 无密码 使用 Pvk2Pfx exe 创建一个包
  • jquery ajax加载覆盖插件[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 没有 Sql Alchemy 引擎的 Dataframe 到 sql

    我有一个数据框 id value name 1 100 sam 2 766 abc 3 234 qqq 4 435 ppp 5 345 mmm 我想将此表保存到 SQL Server 数据库表 tab1 中 我可以df to sql 但当我
  • 在特定日期使用 CSS 更改背景?

    有谁知道如何在特定日期使用 CSS 自动更改网站的背景 比如情人节 复活节 圣诞节等 为此 您必须使用 PHP 或 JavaScript 等服务器端语言 例如 使用 PHP 您可以使用以下命令访问服务器日期 时间date http php
  • 在另一个线程中运行异步函数

    我正在评估异步 CTP 如何开始在另一个线程池的线程上执行异步函数 static async Task Test Do something await something static void Main string args Is th
  • 如何在 Firebase 文件上设置 Access-Control-Allow-Origin

    我正在尝试设置Access Control Allow Origin to 在某个文件上 这是我的 firebase json 文件 database rules database rules json hosting public pub
  • Xunit 以下构造函数参数没有匹配的夹具数据

    在使用 XUnit for NET 1 0 框架 net46 时 我不断收到此错误 以下构造函数参数没有匹配的夹具数据 我看过这个帖子 收集装置不会注入 https stackoverflow com questions 32319903
  • 使用 mmap 逐行读取文件

    我有一个程序可以逐行读取大小不同的文件 我想使用 mmap 但如何使用它来逐行读取文件 谢谢您的回答 一旦你有mmap 编辑文件后 您可以使该文件可用于合适的流缓冲区 从现有内存中读取数据 然后使用std getline include
  • 如何抑制 Qt Creator 中的警告

    我想知道是否可以在 Qt Creator 中抑制编译器特定的警告 我的 g 4 5 打印 警告 条件表达式中的枚举和非枚举类型 我想摆脱它 因为它非常烦人 乌班图 11 04 x64 g 4 5 QtCreator 2 01 Qt 4 7
  • 库类(来自 Android sdk)取决于程序类(同样,Android sdk)

    我们正在从 Android Gradle 插件 2 3 3 迁移到 Gradle 插件 3 0 1 我们的应用程序由应用程序模块和库模块组成 多个依赖项是可传递的 使用api关键字 但甚至使用implementation没有帮助 全部更改后
  • 如何对包含空元素的对象数组进行排序?

    在我的程序中有一个数组fClasses创建固定长度 7 个对象 每个对象都是一个类FClass其中包含 3Strings an int 和int 这些值是从 txt 文件中读取的 并根据该值添加到数组的特定索引中 int txt 文件中的条
  • 为回归方程选择适当的滞后以及如何解释 VARselect 结果

    我的问题有两个方面 如何为回归方程选择合适的滞后 我有房价的因变量 以及租金 房屋供应 国家股市指数 抵押贷款利率和房屋空置率的自变量 我读了一些书 发现VARselect data lag max 1 or 2 or 3 etc 可以帮助
  • ASP.NET Core应用程序设置生产SSL证书

    我可以在我的开发盒上运行得很好 但不能在产品中运行 我在我的域服务器上安装了 SSL 证书 如何告诉我的 ASP NET Core 应用程序使用哪个证书 我想我需要添加一些东西让它知道 我问是因为目前我得到 无法启动 Kestrel Sys
  • 使用XPATH,如何选择包含特定字符串的任何节点

    假设我有一个如下所示的 XML 文件