gpt4 book ai didi

xml - XPath contains(text() ,'some string' ) 与具有多个 Text 子节点的节点一起使用时不起作用

转载 作者:行者123 更新时间:2023-12-03 04:06:58 24 4
gpt4 key购买 nike

我对 XPath contains dom4j 有一个小问题...

假设我的 XML 是

<Home>
<Addr>
<Street>ABC</Street>
<Number>5</Number>
<Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment>
</Addr>
</Home>

假设我想查找给定根元素的文本中包含 ABC 的所有节点...

所以我需要编写的 XPath 是

//*[contains(text(),'ABC')]

但是这不是 dom4j 返回的...这是 dom4j 问题还是我对 XPath 工作原理的理解,因为该查询仅返回 Street元素而不是 Comment元素?

DOM 生成 Comment元素a 具有四个标签的复合元素两个

[Text = 'XYZ'][BR][BR][Text = 'ABC'] 

我假设查询仍应返回该元素,因为它应该找到该元素并在其上运行 contains,但它不会...

下面的查询返回元素,但它返回的不仅仅是元素——它还返回父元素,这对问题来说是不受欢迎的。

//*[contains(text(),'ABC')]

有人知道只返回元素 <Street/> 的 XPath 查询吗?和<Comment/>

最佳答案

<Comment>标签包含两个文本节点和两个 <br>节点作为子节点。

您的 xpath 表达式是

//*[contains(text(),'ABC')]

为了打破这一点,

  1. *是一个匹配任何元素(即标签)的选择器——它返回一个节点集。
  2. []是在该节点集中的每个单独节点上运行的条件。如果它所操作的任何单个节点与括号内的条件匹配,则它匹配。
  3. text()是一个选择器,它匹配上下文节点的所有子节点——它返回一个节点集。
  4. contains是一个对字符串进行操作的函数。如果传递一个节点集,则节点集为converted into a string by returning the string-value of the node in the node-set that is first in document order 。因此,它只能匹配 <Comment> 中的第一个文本节点。元素——即BLAH BLAH BLAH 。由于不匹配,您不会得到 <Comment>在您的结果中。

您需要将其更改为

//*[text()[contains(.,'ABC')]]
  1. *是一个匹配任何元素(即标签)的选择器——它返回一个节点集。
  2. 外部[]是对该节点集中的每个单独节点进行操作的条件 - 此处它对文档中的每个元素进行操作。
  3. text()是一个选择器,它匹配上下文节点的所有子节点——它返回一个节点集。
  4. 内在[]是对该节点集中的每个节点进行操作的条件 - 这里是每个单独的文本节点。每个单独的文本节点是括号中任何路径的起点,也可以明确称为 .括号内。如果它所操作的任何单个节点与括号内的条件匹配,则它匹配。
  5. contains是一个对字符串进行操作的函数。这里传递了一个单独的文本节点( . )。由于它传递的是 <Comment> 中的第二个文本节点。单独标记,它将看到 'ABC'字符串并能够匹配它。

关于xml - XPath contains(text() ,'some string' ) 与具有多个 Text 子节点的节点一起使用时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3655549/

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