与具有多个Text子节点的节点一起使用时,XPath包含(text(),'some string')不起作用
我有一个小问题,Xpath包含dom4j …
可以说我的XML是
<Home> <Addr> <Street>ABC</Street> <Number>5</Number> <Comment>BLAH BLAH BLAH <br/><br/>ABC</Comment> </Addr> </Home>
比方说,我想find所有在给定的根元素的文本中有ABC的节点…
所以我需要写的xpath将是
//*[contains(text(),'ABC')]
然而,这不是什么Dom4j返回….这是一个dom4j的问题,或者我的理解xpath的工作原理。 因为该查询仅返回街元素而不是注释元素。
DOM使Comment元素成为一个具有四个标签二的复合元素
[Text = 'XYZ'][BR][BR][Text = 'ABC']
我会假设查询仍然应该返回的元素,因为它应该find元素和运行包含它,但它不… …
下面的查询返回的元素,但它返回远远多于只是元素,它也返回父元素以及…这是不希望的问题…
//*[contains(text(),'ABC')]
是否有人知道将返回元素<Street/>
和<Comment/>
的xpath查询?
<Comment>
标记包含两个文本节点和两个<br>
节点作为子节点。
你的xpathexpression式是
//*[contains(text(),'ABC')]
为了打破这一点,
-
*
是一个匹配任何元素(即标签)的select器 – 它返回一个节点集。 -
[]
是在该节点集中的每个单独节点上运行的条件。 如果它在其上操作的任何单个节点匹配括号内的条件,则匹配。 -
text()
是一个匹配上下文节点的子节点的所有文本节点的select器 – 它返回一个节点集。 -
contains
是一个对string进行操作的函数。 如果它传递了一个节点集合,节点集合将被转换为一个string,通过返回节点集合中节点的string值,这个节点集合是按照文档顺序排列的 。 因此,它只能匹配<Comment>
元素中的第一个文本节点,即BLAH BLAH BLAH
。 由于这不匹配,所以在结果中没有得到<Comment>
。
你需要改变它
//*[text()[contains(.,'ABC')]]
-
*
是一个匹配任何元素(即标签)的select器 – 它返回一个节点集。 - 外部
[]
是一个条件,在该节点集中的每个单独的节点上运行 – 在这里它对文档中的每个元素进行操作。 -
text()
是一个匹配上下文节点的子节点的所有文本节点的select器 – 它返回一个节点集。 - 内部
[]
是一个条件,在该节点集中的每个节点上操作 – 这里是每个单独的文本节点。 每个单独的文本节点是括号中任何path的起始点,也可以明确地称为.
在括号内。 如果它在其上操作的任何单个节点匹配括号内的条件,则匹配。 -
contains
是一个对string进行操作的函数。 这里传递一个单独的文本节点(.
)。 由于它是单独传递给<Comment>
标签中的第二个文本节点,它将看到'ABC'
string并且能够匹配它。
[contains(text(),'')]
只返回true或false。 它不会返回任何元素结果。