1

私はファイルを持っています:

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

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

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

したがって、別のタグ(例)の中にあるものとそうでないものを区別したいと思い<system>ます。NSXMLParserでこれを行う方法は?私は現在BOOLivarを使用していますが、これは多くのタグであり、これは私が望むほどエレガントではありません。NSXMLParserがSAXパーサーであることを知っており、それを理解しています。

上記の例では、次の方法でdidEndElementメソッドに3回 入力しますelementName。equalどのエントリがどのタグより上にあるかvalueを区別するためのよりエレガントな方法はありますか?<component>

4

1 に答える 1

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

したがって、somethingDeepesttagNameStack配列を解析しているときは次のようになります

@"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 に答える