Here is my .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>
the problem I am having comes from this line of xcode:
NSString* xPath = @"/table/user[@name='Peter O'Toole']/row";
when the username contains any .XML special characters I get an error:
XPath error : Invalid predicate
/table/user[@name='Peter O'Toole']/row
^
xmlXPathEval: evaluation failed
I expected this, but when I change the line to:
NSString* xPath = @"/table/user[@name='Peter O&Toole']/row";
I no longer get the error, but I also don’t get any results.
Any thoughts on this?
You’re in an XPath expression in a string literal, not in XML, so
&isn’t an escape at all (and even if it were, it would be&rather than'). You’re literally matchingnameattributes with the valuePeter O&Toole, ie attributes that would be written in the XML asname="Peter O&amp;Toole".XPath string literals can use either type of quote, so this expression would work:
Which, for inclusion in an Obj-C string literal would need the double-quotes escaping again:
If you have both kinds of quote in a string you want to match, you’ve got more of an issue. XPath string literals do not have an escaping scheme so it’s impossible to state a value with both
"and'in it. You have to do it by concatenating strings that have only one type of quote in. So for arbitrary strings it may be easier to manually iterate-and-compare than to use an XPath.