gpt4 book ai didi

objective-c - GDataXML、命名空间和 xpath

转载 作者:行者123 更新时间:2023-12-03 17:00:28 24 4
gpt4 key购买 nike

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

谢谢!

最佳答案

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

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

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

关于objective-c - GDataXML、命名空间和 xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10133885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com