我正在制作一个 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/