使用XPath按包含空格的值定位节点

use*_*108 9 whitespace xpath

我需要使用XPath通过其值在xml文件中找到节点.当要查找的节点包含内部有空格的值时,问题就会出现问题.铁:

<Root>
  <Child>value</Child>
  <Child>value with spaces</Child>
</Root>
Run Code Online (Sandbox Code Playgroud)

我无法构造定位第二个Child节点的XPath.

简单的XPath/Root/Child适用于两个孩子,但/ Root [Child = value with spaces]返回一个空集合.

我已经尝试用%20屏蔽空格, ,  并使用引号和双引号.

仍然没有运气.

有人有想法吗?

Dim*_*hev 19

根据您的具体情况,有不同的XPath表达式将选择节点,其值包含一些空格.

首先,让我们回想一下,这些字符中的任何一个都是"空白":

    &#x09; - 标签

    &#xA; - 新队

    &#xD; - 回车

    ' '&#x20; - 空间

如果你知道节点的确切值,说它是Hello World带有空格的" ",那么最直接的XPath表达式:

     /top/aChild[. = 'Hello World']

将选择此节点.

但是,指定包含空格的值的困难来自于我们将所有空白字符视为......好,空白并且不知道它是一组空格还是单个选项卡.

XPath 2.0中,可以使用正则表达式,它们提供了一种简单方便的解决方案.因此,我们可以使用XPath 2.0表达式,如下所示:

    /*/aChild[matches(., "Hello\sWorld")]

选择顶级节点的任何子节点,其值为字符串"Hello",后跟空格,后跟字符串"World".注意使用的matches()功能和"的\s匹配空白"的格局.

XPath 1.0中,如果给定的字符串包含任何空格字符,则方便的测试是:

not(string-length(.)= stringlength(translate(., ' &#9;&#xA;&#xD;','')))

这里我们使用translate()函数来消除四个空白字符中的任何一个,并将结果字符串的长度与原始字符串的长度进行比较.

因此,如果在文本编辑器中,节点的值显示为

"你好,世界",

我们可以使用XPath表达式安全地选择此节点:

/*/aChild[translate(., ' &#9;&#xA;&#xD;','') = 'HelloWorld']

在许多情况下,我们也可以使用XPath函数normalize-space(),该函数从其字符串参数生成另一个字符串,其中前导和尾部空格的组被剪切,并且字符串中的每个空格都被单个空格替换.

在上面的例子中,我们将简单地使用以下XPath表达式:

/*/aChild[normalize-space() = 'Hello World']


kdg*_*ory 10

试试这个:

/Root/Child[normalize-space(text())=value without spaces]
Run Code Online (Sandbox Code Playgroud)

要么

/Root/Child[contains(text(),value without spaces)]
Run Code Online (Sandbox Code Playgroud)

或(因为看起来您的测试值可能是问题)

/Root/Child[normalize-space(text())=normalize-space(value with spaces)]
Run Code Online (Sandbox Code Playgroud)

实际上没有执行任何这些语法可能会很糟糕.