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;
    }
}