0

我正在寻找建议。我想用 解析一个XML文件NSXMLParser,我想知道我应该如何处理标签和参数。例如我有:

<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 标签,但我应该在这一点上写它吗NSMutableArrayNSDictionary

我已经阅读了 NSXMLParser 如何将 NSMutableDictionary 传递给 NSMutableArray但这是最​​好的方法吗?

4

2 回答 2

1

如果您知道一个<list>元素包含一个子元素数组,您可能希望在该块的开头创建一个数组或字典:

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

这一切都假定您已经拥有fontdataitemKey等的属性......基本上无论您需要记住所有需要的状态,直到您可以创建相关对象。一旦你有你需要的数据,通常在didEnd方法中,创建对象,将它存储在某个地方,并清除保存的数据。

这不是解析数据的唯一方法。例如,您可能希望改用基于堆栈的方法。但是上面说明的想法可能是最容易理解的,如果数据不是太复杂,也不难管理。

于 2012-04-10T14:52:05.910 回答
0

要获取标签内的内容,请使用:

- (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"];
    }

}

于 2012-04-10T10:43:29.573 回答