首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GDataXML、名称空间和xpath

GDataXML、名称空间和xpath
EN

Stack Overflow用户
提问于 2012-04-13 08:47:59
回答 2查看 1.5K关注 0票数 1

我在使用xpath和GDataXML解析XML时遇到了问题--使用xpath测试程序,我的字符串看起来应该可以工作,但我认为添加名称空间会妨碍它的工作。

XML:

代码语言:javascript
复制
<?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>

我尝试解析它的方法如下:

代码语言:javascript
复制
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];

我还尝试省略名称空间,如下所示:

代码语言:javascript
复制
NSArray *idList = [doc nodesForXPath:@"//Protocol[Type='EXPR']/EwsUrl" error:nil];

在这两种情况下,idList都没有成员。我觉得我现在就像是把东西扔到墙上,看看有没有什么能坚持下去。有人能给我带路吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-13 18:13:04

至于XPath,您需要//response:Protocol[response:Type='EXPR']/response:EwsUrl。我对objective-c的东西无能为力。

票数 2
EN

Stack Overflow用户

发布于 2013-02-14 19:26:26

Martin的答案是正确的,但我想我应该为那些在第一次阅读时错过了它的人(比如我)解释一下为什么。

在设置名称空间映射时,给名称空间一个键,然后在XPath表达式中为选择器加上该键的前缀,后跟一个冒号(:)。此解决方案使用来自neat TouchXML library的CXMLDocuments和CXMLElements。

为了从一个简单的示例开始,假设您的XML是:

代码语言:javascript
复制
<books xmlns="http://what.com/ever">
  <book>
    <title>Life of Pi</title>
  </book>
  <book>
    <title>Crime and Punishment</book>
  </book
</books>

您可以使用以下命令选择所有书籍:

代码语言:javascript
复制
// 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];

请注意,您需要为每个元素添加前缀,而不仅仅是声明名称空间的元素。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10133885

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档