在Objective C中使用GDataXMLNode的XPath

lgd*_*dev 4 xpath objective-c gdataxml

我正在创建一个iOS应用程序,我在Objective C中使用GDataXML库进行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>
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是:

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

NSArray *listOfNodes = [[responseDocument rootElement] nodesForXPath:@"soap:Body/*" error:&error];
Run Code Online (Sandbox Code Playgroud)

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

NSArray *listOfNodes = [[responseDocument rootElement] nodesForXPath:@"soap:Body/MakeRequestResponse" error:&error];
Run Code Online (Sandbox Code Playgroud)

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

Dim*_*hev 8

这是一个FAQ(搜索XPath和默认命名空间).

简短的回答是,当评估XPath表达式时,假定任何未加前缀的名称都在"无名称空间"中.但是MakeRequestResponse不是"没有名称空间",因此没有被选中.

方案:

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

soap:Body/x:MakeRequestResponse
Run Code Online (Sandbox Code Playgroud)

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

soap:Body/*[name() = 'MakeRequestResponse']
Run Code Online (Sandbox Code Playgroud)