这是我的.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&Toole']/row";
我不再收到错误,但我也没有得到任何结果。
对此有何想法?
答案 0 :(得分:3)
你在一个字符串文字的XPath表达式中,而不是在XML中,所以&
根本不是一个转义(即使它是,它也是&
而不是'
{1}})。您确实将name
属性与值Peter O&Toole
匹配,即将在XML中写为name="Peter O&amp;Toole"
的属性。
XPath字符串文字可以使用任何一种类型的引用,因此该表达式可以工作:
/table/user[@name="Peter O'Toole"]/row
其中,要包含在Obj-C字符串文字中,需要再次转义双引号:
NSString* xPath = @"/table/user[@name=\"Peter O'Toole\"]/row";
如果你想要匹配的字符串中有两种引号,那么你就会遇到更多问题。 XPath字符串文字没有转义方案,因此无法在其中声明同时包含"
和'
的值。你必须通过连接只有一种类型的引号的字符串来实现。因此,对于任意字符串,手动迭代和比较可能比使用XPath更容易。