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

时间:2008-12-26 14:35:12

标签: xpath whitespace

我需要使用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; 并使用引号和双引号。

仍然没有运气。

有人有想法吗?

7 个答案:

答案 0 :(得分:19)

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

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

&#x09; - 标签

&#xA; - 换行符

&#xD; - 回车

' ' &#x20; - 空间

如果你知道节点的确切值,说它是带有空格的“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(., ' &#9;&#xA;&#xD;','')))

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

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

“Hello World”,

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

<强> /*/aChild[translate(., ' &#9;&#xA;&#xD;','') = '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&nbsp;Selected&nbsp;File">

我通过使用这个xpath表达式来解决这个问题。

//input[contains(@value,'Import') and contains(@value ,'Selected')and contains(@value ,'File')]

希望这会帮助你们。

答案 3 :(得分:0)

你试过#x20吗?

答案 4 :(得分:0)

我在second link上搜索了这个:

尝试使用“ x0020

替换空格

这似乎适用于那个人。

答案 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);