我需要使用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表达式将选择节点,其值包含一些空格.
首先,让我们回想一下,这些字符中的任何一个都是"空白":
	 - 标签

 - 新队

 - 回车
' '或  - 空间
如果你知道节点的确切值,说它是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(., ' 	

','')))
这里我们使用translate()函数来消除四个空白字符中的任何一个,并将结果字符串的长度与原始字符串的长度进行比较.
因此,如果在文本编辑器中,节点的值显示为
"你好,世界",
我们可以使用XPath表达式安全地选择此节点:
/*/aChild[translate(., ' 	

','') = '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)
实际上没有执行任何这些语法可能会很糟糕.