我正在创建一个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];
我不确定这里有什么问题。它可能是与命名空间相关的问题吗?
答案 0 :(得分:8)
这是一个FAQ (搜索XPath和默认命名空间)。
简短的回答是,当评估XPath表达式时,假定任何未加前缀的名称都在“无名称空间”中。但MakeRequestResponse
不在“无名称空间”中,因此未被选中。
<强>解决方案强>:
注册"http://tempuri.org/"
命名空间并将前缀(例如"x:"
)与之关联,然后使用:
soap:Body/x:MakeRequestResponse
或者,否则你可以有这样的表达式:
soap:Body/*[name() = 'MakeRequestResponse']