首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >XPath和Jabber

XPath和Jabber
EN

Stack Overflow用户
提问于 2010-10-26 04:51:23
回答 1查看 201关注 0票数 1

我正在尝试通过NSXMLElement对象使用Cocoa中的XPATH访问NSXMLElement文档的NSXMLElement元素。

这是element的XML表示形式。

代码语言:javascript
复制
<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>

我试过了,

代码语言:javascript
复制
NSArray *nodes = [element nodesForXPath:@"iq/query/methodCall/methodName"
                                  error:&err];

但是它总是返回一个空的NSArray。

没有命名空间,它工作得很好。

溶液

代码语言:javascript
复制
/*[name()='iq']/*[name()='query' and namespace-uri()='jabber:iq:rpc']/*[name()='methodCall']/*[name()='methodName']
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-10-26 13:19:53

--这是一个关于如何构造带有默认名称空间的文档的XPath表达式的常见问题。其中有很多答案。

造成这个问题的原因是

代码语言:javascript
复制
  <query xmlns='jabber:iq:rpc'>

包含默认命名空间,其所有子代元素都在此命名空间中。

解决方案是,可以使用以下类型的定位步骤:

代码语言:javascript
复制
 *[name()='xxx']

然后是这样的一个XPath表达式:

代码语言:javascript
复制
*[name()='iq']/*[name()='query']/*[name()='methodCall']/*[name()='methodName']

选择所需的节点。

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

代码语言:javascript
复制
*[name()='xxx' and namespace-uri()='theCorrectNamespace']

或者(推荐的)托管语言中的(通常可以)注册'jabber:iq:rpc'命名空间并关联前缀,比如"x:"

然后,选择所需节点的XPath表达式如下所示:

代码语言:javascript
复制
iq/x:query/x:methodCall/x:methodName

其中前缀"x:"与已注册的命名空间'jabber:iq:rpc'相关联。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4020787

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档