与具有多个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')] 

为了打破这一点,

  1. *是一个匹配任何元素(即标签)的select器 – 它返回一个节点集。
  2. []是在该节点集中的每个单独节点上运行的条件。 如果它在其上操作的任何单个节点匹配括号内的条件,则匹配。
  3. text()是一个匹配上下文节点的子节点的所有文本节点的select器 – 它返回一个节点集。
  4. contains是一个对string进行操作的函数。 如果它传递了一个节点集合,节点集合将被转换为一个string,通过返回节点集合中节点的string值,这个节点集合是按照文档顺序排列的 。 因此,它只能匹配<Comment>元素中的第一个文本节点,即BLAH BLAH BLAH 。 由于这不匹配,所以在结果中没有得到<Comment>

你需要改变它

 //*[text()[contains(.,'ABC')]] 
  1. *是一个匹配任何元素(即标签)的select器 – 它返回一个节点集。
  2. 外部[]是一个条件,在该节点集中的每个单独的节点上运行 – 在这里它对文档中的每个元素进行操作。
  3. text()是一个匹配上下文节点的子节点的所有文本节点的select器 – 它返回一个节点集。
  4. 内部[]是一个条件,在该节点集中的每个节点上操作 – 这里是每个单独的文本节点。 每个单独的文本节点是括号中任何path的起始点,也可以明确地称为. 在括号内。 如果它在其上操作的任何单个节点匹配括号内的条件,则匹配。
  5. contains是一个对string进行操作的函数。 这里传递一个单独的文本节点( . )。 由于它是单独传递给<Comment>标签中的第二个文本节点,它将看到'ABC'string并且能够匹配它。

[contains(text(),'')]只返回true或false。 它不会返回任何元素结果。