Objective c 用于创建节点和NSMutableArray的NSXMLParser
我在寻求建议。我想用Objective c 用于创建节点和NSMutableArray的NSXMLParser,objective-c,ios,nsxmlparser,Objective C,Ios,Nsxmlparser,我在寻求建议。我想用NSXMLParser解析XML文件,我想知道应该如何处理标记和参数。 例如,我有: <template> <template name="default" layout="absolute"> <image tmpl="topbanner"/> <list tmpl="list"> <font tmpl="listfont"/>
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>
.
.
.
我知道我可以简单地接收atributes和tags,但在这一点上,我应该在NSMutableArray
或NSDictionary
中编写它吗
我已经读过了,但这是最好的方法吗?要获取标签中的内容,请使用:
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
[element appendString:string];
}
然后签入:
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
要获取属性,请执行以下操作:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
if ([elementName isEqualToString:@"image"]) {
NSString *imageName = [attributeDict objectForKey:@"tmpl"];
}
}如果知道
元素包含子元素数组,则可能需要在该块的开头创建数组或字典:
- (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"];
}
}
然后,您可以在-parser:diEndElement:…
方法中添加简单的
元素:
- (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
、数据
、itemKey
等属性。。。基本上,你需要记住所有你需要的状态,直到你可以创建相关的对象。一旦有了所需的数据,通常在didEnd
方法中,创建对象,将其存储在某处,然后清除保存的数据
这不是解析数据的唯一方法。例如,您可能希望改用基于堆栈的方法。但是上面的想法可能是最容易理解的,如果数据不太复杂,管理起来也不难。对不起,这不能回答我的问题。我都知道,我在我的帖子里也说过。我真的不明白你在这里的意思是什么?在DiEndElement中设置[myDictionary setObject:element forKey:elementName],当到达要创建对象的结束标记时,只需将字典转换为对象。
- (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;
}
}