objective-c - Objective-C 中带有 GDataXMLNode 的 XPath

标签 objective-c xpath gdataxml

我正在制作一个 iOS 应用程序,我在其中使用 GDataXML 库在 Objective C 中进行 xml 解析。

我有以下 xml(作为 soap 响应获得):

<?xml version="1.0" encoding="utf-8"?>
  <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
      <MakeRequestResponse xmlns="http://tempuri.org/">
        <MakeRequestResult>SOMERANDOMDATAHERE012912033905345346</MakeRequestResult>
      </MakeRequestResponse>
    </soap:Body>
  </soap:Envelope>

我遇到的问题是:

当我像这样为给定的 xml 编写 xpath 表达式时,我得到了 MakeRequestResponse 节点:

NSArray *listOfNodes = [[responseDocument rootElement] nodesForXPath:@"soap:Body/*" error:&error];

但是,当我写下实际的节点名称时,我无法获取此节点或下面的任何子节点:

NSArray *listOfNodes = [[responseDocument rootElement] nodesForXPath:@"soap:Body/MakeRequestResponse" error:&error];

我不确定这里的问题是什么。会不会是命名空间相关的问题?

最佳答案

这是一个常见问题解答(搜索 XPath 和默认命名空间)。

简短的回答是,当计算 XPath 表达式时,任何没有前缀的名称都被假定为“无命名空间”。但是 MakeRequestResponse 不在“无 namespace ”中,因此未被选中。

解决方案:

要么注册 "http://tempuri.org/" 命名空间并为其关联一个前缀(比如 "x:"),然后使用:

soap:Body/x:MakeRequestResponse

或者,否则你可以有这样的表达式:

soap:Body/*[name() = 'MakeRequestResponse']

关于objective-c - Objective-C 中带有 GDataXMLNode 的 XPath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8138142/

相关文章:

ios - NSPredicate 使用列表中的任何对象搜索数组 |对象C

Python Selenium 和验证码

objective-c - 在XML文档中使用“小于”字符(<)并进行解析

xcode - 如何使 GDATAXML 与 XCODE 4.2 中的 ARC 兼容?

ios - 为什么在使用手动 View 包含时在错误的时间调用 viewWillDisappear?

ios - iPhone无需代码即可更改后退按钮标题

xml - 循环中的 XSLT 动态节点名称

php - 连接 2 个 XPath 查询

iphone - 更改 GDataXML 中的版本

objective-c - 如何在 iOS Native 应用程序中应用主题