2010-11-11 81 views
1

這裏是我的.XML:如何使用特殊字符(GDataXML)解析.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"; 

我不再犯錯誤,但我也沒有得到任何結果。

對此有何看法?

回答

3

您處於XPath表達式中的字符串文字而不是XML,因此&amp;根本不是轉義(即使它是,它將是&而不是')。實際上,您將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更容易。

+0

謝謝,我真的沒有想到這一點。我會在它們中有一些「和」的東西,但這是直接通過代碼,所以沒有問題。 – 2010-11-11 13:09:26