11

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

<Root>
  <Child>value</Child>
  <Child>value with spaces</Child>
</Root>

我无法构造定位第二个子节点的 XPath。

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

我已经尝试使用%20#20;来屏蔽空格。,   并使用引号和双引号。

仍然没有运气。

有人有想法吗?

4

7 回答 7

20

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

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

    &#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']

于 2008-12-26T17:33:37.817 回答
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)]

还没有实际执行任何这些,因此语法可能很不稳定。

于 2008-12-26T15:11:24.003 回答
2

使用 XPath 按包含空格的值定位属性

我有一个输入类型元素,其值包含空格。

例如:

<input type="button"  value="Import&nbsp;Selected&nbsp;File">

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

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

希望这对你们有帮助。

于 2014-12-03T07:43:10.597 回答
0

你试过#x20 吗?

于 2008-12-26T15:10:27.607 回答
0

我在第二个链接上搜索了这个:

尝试使用“ x0020 ”替换空格

这似乎对这个人有用。

于 2008-12-26T16:14:46.010 回答
0

x0020在一个基于jackrabbit 的CQ5/AEM 存储库中为我工作,其中属性名称有空格。以下适用于属性“记录 ID”-

[(jcr:contains(jcr:content/@Record_x0020_ID, 'test'))]
于 2016-02-05T10:58:50.190 回答
0

以上所有解决方案都对我不起作用。但是,有一个更简单的解决方案。

创建 XMLDocument 时,确保将PreserveWhiteSpace属性设置为 true;

        XmlDocument xmldoc = new XmlDocument();
        xmldoc.PreserveWhitespace = true;
        xmldoc.Load(xmlCollection);
于 2016-07-20T17:15:33.423 回答