1

这是我的 .XML:

<table>
  <report field="FROZEN_BY" />
  <user name="Peter O'Toole" count="16">
    <row>
      <QTY value="2" />
      <EXTENSION value="SLDASM" />
    </row>
    <row>
      <QTY value="3" />
      <EXTENSION value="SLDDRW" />
    </row>
    <row>
      <QTY value="3" />
      <EXTENSION value="SLDPRT" />
    </row>
    <row>
      <QTY value="8" />
      <EXTENSION value="ZIP" />
    </row>
  </user>
</table>

我遇到的问题来自这行xcode:

NSString* xPath = @"/table/user[@name='Peter O'Toole']/row";

当用户名包含任何 .XML 特殊字符时,我得到一个错误:

XPath error : Invalid predicate
/table/user[@name='Peter O'Toole']/row
                          ^
xmlXPathEval: evaluation failed

我预料到了这一点,但是当我将行更改为:

NSString* xPath = @"/table/user[@name='Peter O&amp;Toole']/row";

我不再收到错误,但我也没有得到任何结果。

对此有什么想法吗?

4

1 回答 1

3

您在字符串文字中的 XPath 表达式中,而不是在 XML 中,所以&amp;根本不是转义(即使是转义,也应该是&而不是')。您实际上是在将name属性与 value匹配Peter O&amp;Toole,即将在 XML 中编写为name="Peter O&amp;amp;Toole".

XPath 字符串文字可以使用任何一种类型的引号,所以这个表达式可以工作:

/table/user[@name="Peter O'Toole"]/row

其中,为了包含在 Obj-C 字符串文字中,需要再次转义双引号:

NSString* xPath = @"/table/user[@name=\"Peter O'Toole\"]/row";

如果在要匹配的字符串中同时包含两种引号,那么问题就更大了。XPath 字符串文字没有转义方案,因此不可能同时使用"'在其中声明值。您必须通过连接只有一种引号类型的字符串来做到这一点。因此,对于任意字符串,手动迭代和比较可能比使用 XPath 更容易。

于 2010-11-11T12:16:31.503 回答