如何在NSXMLParser中处理另一个标记内的标记

时间:2012-06-14 12:56:08

标签: objective-c ios nsxmlparser

我有一个文件:

<xml>
    <component>something
        <system>somethingDeeper
            <value>somethingDeepest</value>
        </system>
    </component>

    <component>somethinfDifferent
        <value>somethingDifferentDeeper</value>
    </component>

    <value>somethingNew</value>
</xml>

所以我想区分另一个标签内部的内容(例如<system>)什么不是。如何使用 NSXMLParser 执行此操作?我目前使用BOOL ivar,但这是很多标签,这并不像我想要的那样优雅。我知道NSXMLParser是一个SAX解析器,我理解。

在上面的示例中,我将使用以下方式三次输入didEndElement方法: elementName等于value是否有一种更优雅的方式来区分哪个条目与<component>标记之间的区别?

1 个答案:

答案 0 :(得分:3)

您可以保留当前所在的标记名称数组

NSMutableArray *tagNameStack;

每次输入新元素时,都会将其添加到此数组中。每次离开时,请再次将其删除。即。

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
    [tagNameStack addObject:elementName];

    // Your code here
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    // Your code here

    [tagNameStack removeLastObject];
}

因此,当您解析somethingDeepest时,您的tagNameStack数组将是

@"xml", @"component", @"system", @"value"

您可以使用此堆栈来确定您在xml中的位置,即

- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    if ([tagNameStack containsObject:@"system"]) {
        // Deal with the value inside the system tag
    } else if ([tagNameStack containsObject:@"component"]) {
        // Deal with the value inside the component tag
    } else {
        // This must be the value inside the XML tag
    }
}