XPath - 属性通配符不返回具有名为 value 的属性的元素

2024-02-10

我正在尝试使用 XPath (Java) 来获取基于以特定值开头的未知属性的所有未知节点。由于某种原因,它没有返回包含名为的属性的节点value。我也测试过www.freeformatter.com/xpath-tester.html http://www.freeformatter.com/xpath-tester.html并得到相同的结果。这是我所拥有的:

XML:

<div>
    <object data="/v1/assets/mp4Video-1" type="video/mp4">
        <param name="webmSource" value="/v1/assets/webmVideo-1" type="REF"/>
    </object>
</div>

XPath 表达式:

//*[starts-with(@*, '/v1/assets/')]

结果 -返回<object>,但不是<param>.

现在,如果我将 XPath 表达式更改为//*[starts-with(@*, '/v1/assets/') or starts-with(@value, '/v1/assets/')],它会按预期返回两者。

我想我的问题是,这是关于什么的value属性,导致 XPath 无法正确地将其识别为属性,或者在value属性包含我正在查询的值?


你原来的路径表达式的原因:

//*[starts-with(@*, '/v1/assets/')]

不起作用与 XPath 1.0 中的函数如何处理比预期更多的节点有关。这starts-with()函数期望单个节点作为其第一个参数,字符串(或计算结果为字符串的节点)作为其第二个参数。

但在上面的表达式中,starts-with()被交给set属性节点,@*,作为它的第一个参数。在这种情况下,只有first该函数使用这些属性节点。该集中的所有其他节点都将被忽略。由于 XML 中没有定义属性的顺序,因此 XPath 引擎可以自由选择要在函数中使用的任何属性节点。但是您的特定 XPath 引擎(以及许多其他引擎)似乎始终使用first属性节点,按照其出现的顺序。

为了说明这一点(并证明这一点),请将您的输入文档更改为

<div>
    <object data="other" type="/v1/assets/mp4Video-1">
        <param name="/v1/assets/webmVideo-1" value="other" type="REF"/>
    </object>
</div>

如您所见,我更改了属性的顺序,并且属性包含/v1/assets/现在是second的属性object元素,反之亦然param元素。使用此输入文档,您的原始 XPath 表达式将仅返回param元素。

同样,这种行为在不同的 XPath 引擎之间不一定一致!使用 XPath 的其他实现可能会产生不同的结果。


满足您需要的 XPath 表达式是

//*[@*[starts-with(., '/v1/assets/')]]

用简单的英语来说,它说

选择文档中任意位置的元素,但前提是该元素的所有属性节点中存在一个值以“/v1/assets/”开头的属性。

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

XPath - 属性通配符不返回具有名为 value 的属性的元素 的相关文章

  • Play框架运行应用程序问题

    每当我尝试运行使用以下命令创建的新 Web 应用程序时 我都会收到以下错误Play http www playframework org Error occurred during initialization of VM Could no
  • 使用 XPATH(和 PHP)从样式属性中选择背景 url

    我只想从此背景图像样式属性中选择 url 这可以通过 XPATH 实现吗 a href http www test com style background image none test a 我有类似的东西 url xpath gt qu
  • 使用非 ASCII(自然语言)XML 标签是否合适?

    使用以非 ASCII 自然语言编写的 XML 标签 元素名称 是否合适 XML 规范允许这样做 请参阅Names http www w3 org TR 2006 REC xml11 20060816 NT Name and 例外情况 htt
  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • Android MediaExtractor seek() 对 MP3 音频文件的准确性

    我在使用 Android 时无法在eek 上获得合理的准确度MediaExtractor 对于某些文件 例如this one http www archive org download emma solo librivox emma 01
  • 多个 Maven 配置文件激活多个 Spring 配置文件

    我想在 Maven 中构建一个环境 在其中我想根据哪些 Maven 配置文件处于活动状态来累积激活多个 spring 配置文件 目前我的 pom xml 的相关部分如下所示
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • JavaMail 只获取新邮件

    我想知道是否有一种方法可以在javamail中只获取新消息 例如 在初始加载时 获取收件箱中的所有消息并存储它们 然后 每当应用程序再次加载时 仅获取新消息 而不是再次重新加载它们 javamail 可以做到这一点吗 它是如何工作的 一些背
  • Liferay ClassNotFoundException:DLFileEntryImpl

    在我的 6 1 0 Portal 实例上 带有使用 ServiceBuilder 和 DL Api 的 6 1 0 SDK Portlet 这一行 DynamicQuery query DynamicQueryFactoryUtil for
  • 为什么 XML 中的 CDATA 语法看起来如此奇怪?

    CDATA 在 XML 中的使用如下
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • 总是使用 Final?

    我读过 将某些东西做成最终的 然后在循环中使用它会带来更好的性能 但这对一切都有好处吗 我有很多地方没有循环 但我将 Final 添加到局部变量中 它会使速度变慢还是仍然很好 还有一些地方我有一个全局变量final 例如android Pa
  • 如何在控制器、服务和存储库模式中使用 DTO

    我正在遵循控制器 服务和存储库模式 我只是想知道 DTO 在哪里出现 控制器应该只接收 DTO 吗 我的理解是您不希望外界了解底层域模型 从领域模型到 DTO 的转换应该发生在控制器层还是服务层 在今天使用 Spring MVC 和交互式
  • Java执行器服务线程池[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如果我使用 Executor 框架在
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • 在 Maven 依赖项中指定 jar 和 test-jar 类型

    我有一个名为 commons 的项目 其中包含运行时和测试的常见内容 在主项目中 我添加了公共资源的依赖项
  • 如何锁定/密码保护 XML 文件?

    我在 XML 文件中读取和写入数据 我不希望其他人阅读该文件 所以我想为我的文件创建密码或锁定文件 我怎样才能做到这一点 如果不使用加密软件 则无法使用密码保护 XML 文件 XML 文件只是文本 但像 PGP 谷歌搜索 这样的程序应该可以

随机推荐