在Objective C中使用GDataXMLNode的XPath

时间:2011-11-15 14:45:14

标签: objective-c xpath gdataxml

我正在创建一个iOS应用程序,我在目标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>

我遇到的问题是:

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

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

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

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

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

1 个答案:

答案 0 :(得分:8)

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

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

<强>解决方案

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

soap:Body/x:MakeRequestResponse

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

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