1

我有一个文件:

<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方法三次: elementNameequalvalue有没有更优雅的方法来区分什么条目是从<component>上面的标签什么不是?

4

1 回答 1

3

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

NSMutableArray *tagNameStack;

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

- (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
    }
}
于 2012-06-18T11:55:52.630 回答