我需要使用XPath通过其值在xml文件中找到节点。 当要查找的节点包含内部有空格的值时,问题就会出现问题。 F.e:
<Root>
<Child>value</Child>
<Child>value with spaces</Child>
</Root>
我无法构造定位第二个子节点的XPath。
Simple XPath / Root / Child对两个孩子都很有效,但/ Root [Child =带空格的值]返回一个空集合。
我已尝试使用%20 ,&amp; #20; ,&amp; nbsp; 并使用引号和双引号。
仍然没有运气。
有人有想法吗?
答案 0 :(得分:19)
根据您的具体情况,有不同的XPath表达式将选择节点,其值包含一些空格。
首先,让我们回想一下,这些字符中的任何一个都是“空白”:
	
- 标签


- 换行符

- 回车
' '
或  
- 空间
如果你知道节点的确切值,说它是带有空格的“Hello World
”,那么最直接的XPath表达式:
/top/aChild[. = 'Hello World']
将选择此节点。
但是,指定包含空格的值的困难来自于我们看到所有空白字符就像......好吧,空白并且不知道它是否是一组空格或一个标签。
在XPath 2.0中,可以使用regular expressions,它们提供简单方便的解决方案。因此,我们可以使用XPath 2.0表达式,如下所示:
<强> /*/aChild[matches(., "Hello\sWorld")]
强>
选择顶级节点的任何子节点,其值为字符串“Hello”,后跟空格后跟字符串“World”。 注意使用matches()
函数以及与空格匹配的“ \s
”模式。
在XPath 1.0 中,如果给定字符串包含任何空白字符,则方便测试:
<强> not(string-length(.)= stringlength(translate(., ' 	

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

','') = 'HelloWorld']
强>
在许多情况下,我们也可以使用XPath函数normalize-space()
,它从字符串参数生成另一个字符串,其中前导和尾随空格的组被剪切,字符串中的每个空格都被一个字符串替换空间。
在上面的例子中,我们将简单地使用以下XPath表达式:
<强> /*/aChild[normalize-space() = 'Hello World']
强>
答案 1 :(得分:10)
尝试以下方法:
/Root/Child[normalize-space(text())=value without spaces]
或
/Root/Child[contains(text(),value without spaces)]
或(因为看起来您的测试值可能是问题)
/Root/Child[normalize-space(text())=normalize-space(value with spaces)]
实际上没有执行任何这些,所以语法可能不稳定。
答案 2 :(得分:1)
使用包含使用XPath的空格的值定位属性
我有一个输入类型元素,其值包含空格。
例如:
<input type="button" value="Import Selected File">
我通过使用这个xpath表达式来解决这个问题。
//input[contains(@value,'Import') and contains(@value ,'Selected')and contains(@value ,'File')]
希望这会帮助你们。
答案 3 :(得分:0)
答案 4 :(得分:0)
答案 5 :(得分:0)
“ x0020 ”在基于长耳大巴的CQ5 / AEM存储库上为我工作,其中属性名称包含空格。以下将适用于“记录ID”属性 -
[(jcr:contains(jcr:content/@Record_x0020_ID, 'test'))]
答案 6 :(得分:0)
以上所有解决方案对我来说都不起作用。 但是,这是一个更简单的解决方案。
创建XMLDocument时,请确保将 PreserveWhiteSpace 属性设置为true;
XmlDocument xmldoc = new XmlDocument();
xmldoc.PreserveWhitespace = true;
xmldoc.Load(xmlCollection);