我正在寻求建议。我想用 NSXMLParser 解析 XML 文件,我想知道应该如何处理标签和参数。 例如我有:
<template>
<template name="default" layout="absolute">
<image tmpl="topbanner"/>
<list tmpl="list">
<font tmpl="listfont"/>
<item target="target1">
<text>Target1</text>
</item>
<item target="target2">
<text>Target2</text>
</item>
<item target="target3">
<text>Target3</text>
</item>
.
.
.
后来我想根据这些信息创建一个对象。那么 - 我应该在哪里存储从解析器检索的信息?在方法中:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
element = [NSMutableString string];
}
我发现我可以简单地接收属性 ang 标签,但是我应该将其写在 NSMutableArray
或 NSDictionary
中吗?
我已阅读 NSXMLParser how to pass the NSMutableDictionary to a NSMutableArray但这是最好的方法吗?
最佳答案
如果您知道 <list>
element 包含子元素数组,您可能需要在该 block 的开头创建一个数组或字典:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString:@"list"]) {
self.list = [NSMutableDictionary dictionary];
self.listName = [attributeDict objectForKey:@"tmpl"]
}
else if ([elementName isEqualToString:@"item"]) {
self.itemKey = [attributeDict objectForKey:@"target"];
}
else if ([elementName isEqualToString:@"text"]) {
self.data = [NSMutableString string];
}
else if ([elementName isEqualToString:@"font"]) {
self.font = [attributeDict objectForKey:@"tmpl"];
}
}
然后您可以添加简单的 <item>
您的 -parser:didEndElement:...
中的元素方法:
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if (elementName isEqualToString:@"text") {
// no action needed here -- data already contains the text
}
else if (elementName isEqualToString:@"item"]) {
[self.list setObject:[self.data copy] forKey:self.itemKey;
self.itemKey = nil;
}
else if ([elementName isEqualToString:@"list"]) {
// do something appropriate with the list
[self.template setObject:self.items forKey:self.listName];
self.listName = nil;
self.list = nil;
}
}
这一切都假设您拥有 font
的属性, data
, itemKey
等等...基本上,无论您需要记住什么,都需要记住您需要的所有状态,直到您可以创建相关对象。获得所需数据后,通常在 didEnd
中方法,创建对象,将其存储在某处,并清除保存的数据。
这不是解析数据的唯一方法。例如,您可能想采用基于堆栈的方法。但上面阐述的想法可能是最容易理解的,如果数据不太复杂,管理起来并不难。
关于objective-c - NSXMLParser 创建节点和 NSMutableArray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10086564/