首页 文章

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

提问于
浏览
193

我有一个小问题,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 回答

  • 563

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

  • 0

    我花了一点时间,但终于想通了 . 包含下面一些文本的自定义xpath对我来说非常合适 .

    //a[contains(text(),'JB-')]
    
  • 7

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

    你的xpath表达式是

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

    为了打破这种局面,

    • * 是一个匹配任何元素(即标记)的选择器 - 它返回一个节点集 .

    • [] 是对该节点集中的每个单独节点进行操作的条件 . 如果它操作的任何单个节点与括号内的条件匹配,则匹配 .

    • 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(.,'ABC')]]
    
    • * 是一个匹配任何元素(即标记)的选择器 - 它返回一个节点集 .

    • 外部 [] 是对该节点集中的每个单独节点进行操作的条件 - 此处它对文档中的每个元素进行操作 .

    • text() 是一个选择器,它匹配作为上下文节点的子节点的所有文本节点 - 它返回一个节点集 .

    • 内部 [] 是一个条件,对该节点集中的每个节点进行操作 - 这里是每个单独的文本节点 . 每个单独的文本节点是括号中任何路径的起点,也可以在括号内明确表示为 . . 如果它操作的任何单个节点与括号内的条件匹配,则匹配 .

    • contains 是一个对字符串进行操作的函数 . 这里传递一个单独的文本节点( . ) . 由于它单独传递 <Comment> 标记中的第二个文本节点,因此它将看到 'ABC' 字符串并且能够匹配它 .

相关问题