Как анализировать .XML со специальными символами (GDataXML) - PullRequest
1 голос
/ 11 ноября 2010

Вот мой .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 Ответ

3 голосов
/ 11 ноября 2010

Вы находитесь в выражении 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.

...