1

我在使用 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 都有 0 个成员。我感觉好像我现在只是在墙上扔东西,看看有没有东西粘住。有人能给我指路吗?

谢谢!

4

2 回答 2

3

马丁的回答是正确的,但我想我会为那些在初读时错过它的人(比如我)解释为什么。

当您设置命名空间映射时,给命名空间一个键,然后在您的 XPath 表达式中为您的选择器添加前缀,该键后跟一个冒号 (:)。该解决方案使用整洁的TouchXML 库中的 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];

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

于 2013-02-14T11:26:26.417 回答
2

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

于 2012-04-13T10:13:04.057 回答