如何处理 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>上面的标签?

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

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

最新更新