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

XML ではなく、文字列リテラルの XPath 式にいるため&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 文字列リテラルにはエスケープ スキームがないため、 と の両方"で値を指定することはできません'。引用符の種類が 1 つしかない文字列を連結することで、これを行う必要があります。そのため、任意の文字列については、XPath を使用するよりも、手動で繰り返して比較する方が簡単な場合があります。

于 2010-11-11T12:16:31.503 に答える