XPath с GDataXMLNode в Objective C - PullRequest
       23

XPath с GDataXMLNode в Objective C

4 голосов
/ 15 ноября 2011

Я создаю приложение для iOS, в котором я использую библиотеку GDataXML для анализа XML в Objective C.

У меня есть следующий xml (который я получаю как мыльный ответ):

<?xml version="1.0" encoding="utf-8"?>
  <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
      <MakeRequestResponse xmlns="http://tempuri.org/">
        <MakeRequestResult>SOMERANDOMDATAHERE012912033905345346</MakeRequestResult>
      </MakeRequestResponse>
    </soap:Body>
  </soap:Envelope>

У меня проблема:

когда я пишу выражение xpath для данного xml следующим образом, я получаю узел MakeRequestResponse:

NSArray *listOfNodes = [[responseDocument rootElement] nodesForXPath:@"soap:Body/*" error:&error];

Однако я не могу получить этот узел или дочерние элементы ниже, когда пишу фактическое имя узла:

NSArray *listOfNodes = [[responseDocument rootElement] nodesForXPath:@"soap:Body/MakeRequestResponse" error:&error];

Я не уверен, в чем здесь проблема. Может ли это быть проблема, связанная с пространством имен?

1 Ответ

8 голосов
/ 15 ноября 2011

Это часто задаваемые вопросы (поиск XPath и пространства имен по умолчанию).

Краткий ответ: при вычислении выражения XPath любые нефиксированные имена считаются находящимися в «пространстве имен». Но MakeRequestResponse не находится в «пространстве имен» и поэтому не выбрано.

Решение

Зарегистрируйте пространство имен "http://tempuri.org/" и свяжите с ним префикс (скажем, "x:"), затем используйте:

soap:Body/x:MakeRequestResponse

Или, в противном случае, вы можете иметь такое выражение:

soap:Body/*[name() = 'MakeRequestResponse']
...