我在使用xpath和GDataXML解析XML时遇到了问题--使用xpath测试程序,我的字符串看起来应该可以工作,但我认为添加名称空间会妨碍它的工作。
XML:
<?xml version="1.0" encoding="utf-8"?>
<Autodiscover xmlns='http://schemas.microsoft.com/exchange/autodiscover/responseschema/2006'>
<Response xmlns='http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a'>
<Account>
<Protocol>
<Type>EXPR</Type>
<EwsUrl>https://server.my.dom/EWS/Exchange.asmx</EwsUrl>
</Protocol>
</Account>
</Response>
</Autodiscover>我尝试解析它的方法如下:
NSDictionary *namespaceMappings = [NSDictionary dictionaryWithObjectsAndKeys:@"http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a", @"response", nil];
NSArray *idList = [doc nodesForXPath:@"//response:Protocol[Type='EXPR']/EwsUrl" namespaces:namespaceMappings error:nil];我还尝试省略名称空间,如下所示:
NSArray *idList = [doc nodesForXPath:@"//Protocol[Type='EXPR']/EwsUrl" error:nil];在这两种情况下,idList都没有成员。我觉得我现在就像是把东西扔到墙上,看看有没有什么能坚持下去。有人能给我带路吗?
谢谢!
发布于 2012-04-13 18:13:04
至于XPath,您需要//response:Protocol[response:Type='EXPR']/response:EwsUrl。我对objective-c的东西无能为力。
发布于 2013-02-14 19:26:26
Martin的答案是正确的,但我想我应该为那些在第一次阅读时错过了它的人(比如我)解释一下为什么。
在设置名称空间映射时,给名称空间一个键,然后在XPath表达式中为选择器加上该键的前缀,后跟一个冒号(:)。此解决方案使用来自neat TouchXML library的CXMLDocuments和CXMLElements。
为了从一个简单的示例开始,假设您的XML是:
<books xmlns="http://what.com/ever">
<book>
<title>Life of Pi</title>
</book>
<book>
<title>Crime and Punishment</book>
</book
</books>您可以使用以下命令选择所有书籍:
// So, assuming you've already got the data for the XML document
CXMLDocument* xmldoc = [[CXMLDocument alloc] initWithData:xmlDocData options:0 error:nil];
NSDictionary *namespaceMappings = [NSDictionary dictionaryWithObjectsAndKeys:@"http://what.com/ever", @"nskey", nil];
NSError *error = nil;
NSArray *bookElements = [xmldoc nodesForXPath:@"/nskey:books/nskey:book" namespaceMappings:mappings error:&error];请注意,您需要为每个元素添加前缀,而不仅仅是声明名称空间的元素。
https://stackoverflow.com/questions/10133885
复制相似问题