XPath и Jabber-RPC - PullRequest
       2

XPath и Jabber-RPC

1 голос
/ 26 октября 2010

Я пытаюсь получить доступ к элементу methodName XML-документа, используя XPATH в Какао через объект NSXMLElement.

Это XML-представление element

<iq type='set' 
    from='requester@company-b.com/jrpc-client' 
    to='responder@company-a.com/jrpc-server' 
    id='rpc1'>
  <query xmlns='jabber:iq:rpc'>
    <methodCall>
      <methodName>examples.getStateName</methodName>
      <params>
        <param>
          <value><i4>6</i4></value>
        </param>
      </params>
    </methodCall>
  </query>
</iq>

Iпробовал,

NSArray *nodes = [element nodesForXPath:@"iq/query/methodCall/methodName"
                                  error:&err];

, но он всегда возвращает пустой NSArray.

Он прекрасно работает без пространства имен.

Solution

/*[name()='iq']/*[name()='query' and namespace-uri()='jabber:iq:rpc']/*[name()='methodCall']/*[name()='methodName']

1 Ответ

1 голос
/ 26 октября 2010

Это часто задаваемые вопросы о том, как создать выражение XPath для документа с пространством имен по умолчанию . В SO много ответов.

Причина этой проблемы в том, что

  <query xmlns='jabber:iq:rpc'>

содержит пространство имен по умолчанию , и все его дочерние элементы находятся в этом пространстве имен.

Решение - , либо использовать шаги местоположения типа:

 *[name()='xxx']

Затем выражение XPath вида:

*[name()='iq']/*[name()='query']/*[name()='methodCall']/*[name()='methodName']

выбирает нужные узлы.

В еще более сложных случаях, когда существует несколько (вложенных) пространств имен по умолчанию, может потребоваться использование шагов размещения вида:

*[name()='xxx' and namespace-uri()='theCorrectNamespace']

Или (рекомендуется) на языке хостинга (обычно это возможно), чтобы зарегистрировать пространство имен 'jabber:iq:rpc' и связать с ним префикс, скажем "x:".

Тогда выражение XPath, выбирающее нужные узлы, будет выглядеть так:

iq/x:query/x:methodCall/x:methodName

, где префикс "x:" связан с зарегистрированным пространством имен 'jabber:iq:rpc'.

...