XPath和Jabber-RPC

时间:2010-10-26 04:51:23

标签: xml cocoa xml-namespaces xpath

我正在尝试通过NSXMLElement对象在Cocoa中使用XPATH访问XML文档的methodName元素。

这是element

的XML表示形式
<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>

我试过了,

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

但它总是返回一个空的NSArray。

没有命名空间就可以正常工作。

解决方案

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

1 个答案:

答案 0 :(得分:1)

这是关于如何在具有默认命名空间的文档中再次构造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'关联。