此项目来自Troy Brant开发的组件,并将其发布在他的网站上:http://troybrant.net/blog/2010/09/simple-xml-to-nsdictionary-converter/
我正在开源我对其所做的部分更新。
NSData *data = ...; // some data that can be received from remote service
NSError *error = nil;
NSDictionary *dict = [XMLReader dictionaryForXMLData:data
options:XMLReaderOptionsProcessNamespaces
error:&error];
因为项目使用“自动生成的属性”功能,所以需要 Xcode 4.4 或以上版本。
NSDictionary
,而必须得到一个 NSArray
,为什么?在 XMLReader
的算法中,当解析器找到一个新的标签时,它会自动创建一个 NSDictionary
,如果它在 XML 树中的同一级别发现了相同标签的另一个出现,它会创建另一个字典,并将两个字典放入一个 NSArray
中。
结果是:如果您有一个仅包含一个项目的列表,您将得到一个 NSDictionary
而不是 NSArray
作为结果。唯一的解决方案是使用 isKindOfClass:
检查字典中包含的对象的类。请参阅下面的示例代码
NSData *data = ...;
NSError *error = nil;
NSDictionary *dict = [XMLReader dictionaryForXMLData:data error:&error];
NSArray *list = [dict objectForKey:@"list"];
if (![list isKindOfClass:[NSArray class]])
{
// if 'list' isn't an array, we create a new array containing our object
list = [NSArray arrayWithObject:list];
}
// we can loop through items safely now
for (NSDictionary *item in list)
{
// ...
}
您有两个选择
XMLReader.m
文件中。好的,没有人是完美的,但您仍然可以使用 "no-objc-arc" 分支。
感谢此组件的原作者 Troy Brant 以及 Divan "snip3r8" Visagie 提供了对 ARC 的支持。
版权所有(C) 2012 安托万·马卡代
特此授予任何人获得此软件及其相关文档文件(以下简称“软件”)的副本的权利,无需支付费用,包括但不限于使用、复制、修改、合并、发布、分发、再许可和/或销售软件副本的权利,以及允许接受软件的人实施上述行为,但须遵守以下条件
上述版权声明和本许可声明应包含在软件的所有副本或实质性部分中。
软件按“现状”提供,不提供任何形式的保证,无论是明示的、暗示的还是因商品性、特定目的适用性或非侵权性而提供的任何保证。在任何情况下,作者或版权所有者均不对因使用、滥用软件或与之相关的软件或使用、操作等引起的任何索赔、损失或其他责任承担责任,包括但不限于合同行为、侵权或其他任何行为。