我正在尝试通过NSXMLElement对象使用Cocoa中的XPATH访问NSXMLElement文档的NSXMLElement元素。
这是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']发布于 2010-10-26 13:19:53
--这是一个关于如何构造带有默认名称空间的文档的XPath表达式的常见问题。其中有很多答案。
造成这个问题的原因是
<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'相关联。
https://stackoverflow.com/questions/4020787
复制相似问题