Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XPath和Jabber RPC_Xml_Cocoa_Xml Namespaces_Xpath - Fatal编程技术网

Xml XPath和Jabber RPC

Xml XPath和Jabber RPC,xml,cocoa,xml-namespaces,xpath,Xml,Cocoa,Xml Namespaces,Xpath,我试图通过NSXMLElement对象在Cocoa中使用XPATH访问XML文档的methodName元素 这是元素 <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>

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

这是
元素

<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

它在没有名称空间的情况下运行良好

解决方案

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

这是一个常见问题解答,介绍如何针对具有默认命名空间的文档构造XPath表达式。在SO中有很多答案

这个问题的原因是

  <query xmlns='jabber:iq:rpc'>
然后是以下类型的XPath表达式:

*[name()='iq']/*[name()='query']/*[name()='methodCall']/*[name()='methodName']
*[name()='xxx' and namespace-uri()='theCorrectNamespace']
选择所需的节点

在存在多个(嵌套的)默认名称空间的更复杂的情况下,可能需要使用以下类型的位置步骤:

*[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'
这是一个关于如何在具有默认命名空间的文档中构建XPath表达式的常见问题解答。在SO中有很多答案

这个问题的原因是

  <query xmlns='jabber:iq:rpc'>
然后是以下类型的XPath表达式:

*[name()='iq']/*[name()='query']/*[name()='methodCall']/*[name()='methodName']
*[name()='xxx' and namespace-uri()='theCorrectNamespace']
选择所需的节点

在存在多个(嵌套的)默认名称空间的更复杂的情况下,可能需要使用以下类型的位置步骤:

*[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'

好问题,+1。请参阅我的答案,以获得详细解释和两种备选解决方案。好问题,+1。请参阅我的答案以获得详细的解释和两种备选解决方案。我非常喜欢推荐的解决方案,但我找不到如何在cocoa中注册名称空间的任何地方@肯德尔:我对可可一无所知。将你的问题标记为“xpathengines”和“cocoa”,可能有人碰巧提供了这些信息。@Dimitre你能给我举一个另一种语言的例子吗?在哪里注册名称空间?在Xpath对象上,XML元素?@Dimitre:+1的解释比我的更为耐心。@Kendall Hopkins:Cocoa没有将名称空间URI注册到前缀绑定的方法。我非常喜欢推荐的方法,但我找不到在Cocoa中注册名称空间的方法@肯德尔:我对可可一无所知。将你的问题标记为“xpathengines”和“cocoa”,可能有人碰巧提供了这些信息。@Dimitre你能给我举一个另一种语言的例子吗?在哪里注册名称空间?在Xpath对象上,XML元素?@Dimitre:+1比我的解释更耐心。@Kendall Hopkins:Cocoa没有将名称空间URI注册到前缀绑定的方法。