4

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

我有以下 xml(作为肥皂响应得到):

<?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];

我不确定这里有什么问题。这可能是与命名空间相关的问题吗?

4

1 回答 1

8

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

简短的回答是,在评估 XPath 表达式时,假定任何无前缀的名称都位于“无命名空间”中。但MakeRequestResponse不在“无命名空间”中,因此未被选中。

解决方案

注册"http://tempuri.org/"命名空间并将前缀(比如"x:")关联到它,然后使用:

soap:Body/x:MakeRequestResponse

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

soap:Body/*[name() = 'MakeRequestResponse']
于 2011-11-15T15:33:16.170 回答