gpt4 book ai didi

XPath 表达式,如果存在则选择 NodeA,否则回退到 NodeB

转载 作者:行者123 更新时间:2023-12-03 16:02:21 25 4
gpt4 key购买 nike

解析POM文件时,想读/project/groupId如果存在。但是,如果它不存在,我想阅读 /project/parent/groupId .怎么可能呢?

最佳答案

如果您有 XPath 2.0,那么很容易:

(/project/groupId, /project/parent/groupId)[1]

在 XPath 1.0 中它更复杂,因为没有像在 XPath 2.0 中那样的节点有序序列的概念——你可以构建节点集的联合,但位置谓词总是指文档顺序,所以
(/project/groupId | /project/parent/groupId)[1]

会给你 /project/groupId中的任何一个或 /project/parent/groupId首先出现在 XML 文档中。

对于这种情况,您可以使用一个技巧,即当您在 XPath 中将 bool 值视为数字时,true 变为 1,false 变为 0:
substring(concat(/project/parent/groupId, /project/groupId),
boolean(/project/groupId) * string-length(/project/parent/groupId) + 1)

为了解释这是做什么的,举个例子——父groupId是“foo”,项目groupId是“bar”。首先,我们将两者连接起来,首先是父级 - “foobar”。接下来我们检查项目 groupId 元素是否存在,既然存在
  • boolean(/project/groupId) * string-length(/project/parent/groupId) + 1 = 3 + 1 = 4

  • 所以我们从第四个字符开始取子字符串,得到结果“bar”。

    现在假设父 groupId 是“foo”并且没有项目 groupId。在这种情况下
  • concat(/project/parent/groupId, /project/groupId)只是“foo”
  • boolean(/project/groupId) * string-length(/project/parent/groupId) + 1 = 0 + 1 = 1

  • 由于“从第一个字符开始的子字符串”是整个字符串,因此这给出了“foo”的正确结果。

    附言记住你需要考虑命名空间——Maven POM 文件通常声明 http://maven.apache.org/POM/4.0.0作为默认命名空间,因此您需要使用 XPath 库提供的任何机制将其设置为默认命名空间(如果可能)或将其绑定(bind)到合适的前缀并使用 /pom:project/pom:groupId 之类的路径

    关于XPath 表达式,如果存在则选择 NodeA,否则回退到 NodeB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27234421/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com