我有一个小问题,Xpath包含dom4j ...
让我们说我的XML是
<Home>
<Addr>
<Street>ABC</Street>
<Number>5</Number>
<Comment>BLAH BLAH BLAH
ABC</Comment>
</Addr>
</Home>
假设我想在给定根元素的文本中找到所有具有ABC的节点...
所以我需要写的xpath就是
//*[contains(text(),'ABC')]
然而,这不是Dom4j返回的......这是一个dom4j问题还是我对xpath如何工作的理解 . 因为该查询仅返回Street元素而不返回Comment元素 .
DOM使Comment元素成为具有四个标记2的复合元素
[Text = 'XYZ'][BR][BR][Text = 'ABC']
我认为查询应该仍然返回元素,因为它应该找到元素并运行包含但它不会......
下面的查询返回元素,但它返回的远远多于元素,它返回父元素...这对问题是不可取的...
//*[contains(text(),'ABC')]
有没有人知道只返回Elements <Street/>
和 <Comment/>
的xpath查询?
3 回答
[contains(text(),'')]
仅返回true或false . 它不会返回任何元素结果 .我花了一点时间,但终于想通了 . 包含下面一些文本的自定义xpath对我来说非常合适 .
<Comment>
标记包含两个文本节点和两个<br>
节点作为子节点 .你的xpath表达式是
为了打破这种局面,
*
是一个匹配任何元素(即标记)的选择器 - 它返回一个节点集 .[]
是对该节点集中的每个单独节点进行操作的条件 . 如果它操作的任何单个节点与括号内的条件匹配,则匹配 .text()
是一个选择器,它匹配作为上下文节点的子节点的所有文本节点 - 它返回一个节点集 .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
是一个对字符串进行操作的函数 . 这里传递一个单独的文本节点(.
) . 由于它单独传递<Comment>
标记中的第二个文本节点,因此它将看到'ABC'
字符串并且能够匹配它 .