如何使用特殊字符解析.XML(GDataXML)

时间:2010-11-11 12:06:02

标签: xml xcode gdata

这是我的.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";

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

对此有何想法?

1 个答案:

答案 0 :(得分:3)

你在一个字符串文字的XPath表达式中,而不是在XML中,所以&amp;根本不是一个转义(即使它是,它也是&而不是' {1}})。您确实将name属性与值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更容易。