gpt4 book ai didi

xml - XPath 和 Jabber-RPC

转载 作者:行者123 更新时间:2023-12-03 17:16:56 24 4
gpt4 key购买 nike

我正在尝试通过 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']

最佳答案

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

关于xml - XPath 和 Jabber-RPC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4020787/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com