Xml XPath和Jabber RPC
我试图通过NSXMLElement对象在Cocoa中使用XPATH访问XML文档的methodName元素 这是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>
元素
<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注册到前缀绑定的方法。