我正在尝试通过NSXMLElement对象在Cocoa中使用XPATH访问XML文档的methodName元素。
这是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>
我试过了,
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']
答案 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'
关联。