objective-c - NSXMLParser 创建节点和 NSMutableArray

标签 objective-c ios nsxmlparser

我正在寻求建议。我想用 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 标签,但是我应该将其写在 NSMutableArrayNSDictionary 中吗?

我已阅读 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/

相关文章:

ios - 将 Swift 文件添加到我的项目会导致无效模块错误

javascript - 从 UIWebView 中提取文本

ios - 单击 UIWebView 的文本输入时键盘不可见

ios - 我可以使用类别和运行时向 UIScrollView 添加一个 BOOL 类型属性 "isScrolling"吗?

iphone - NSXMLParser & 问题

iPhone:解析具有阿拉伯语内容的 Xml 显示空值

iphone - 如何将数组数据传递给另一个方法

iphone - 以编程方式创建元素并重用代码

objective-c - 如何在 iOS 上试验私有(private) API?

ios - 如何手动输入10000个原始数据到core data?