此项目源自 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];
因为项目使用了 "auto-synthesized property" 功能,所以需要 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 Antoine Marcadet
在此特此授予任何人免费获得此软件及其相关文档文件(以下简称“软件”)的副本(以下简称“任何一方”),在不限制此软件的使用、复制、修改、合并、发布、分发、再许可和/或出售软件副本的权利,并允许软件的接收人有权这样做,但受以下条件限制:
所有副本或软件的实质性部分的副本中均应包含上述版权声明和本许可声明。
本软件按“现状”提供,不提供任何形式的明示或暗示的保证,包括但不限于适销性、特定用途适用性和非侵权性保证。在任何事件中,作者或版权所有者均不对任何索赔、损害或其他义务(包括但不限于因合同、侵权或其他行为而引起的索赔、损害或其他责任)承担责任,无论权利、损害或其他义务是否由此软件或其使用或其他方式产生、出现或与之相关。