0

アドバイスを探しています。XMLを使用してファイルを解析したいのですNSXMLParserが、タグとパラメーターをどうすればよいのでしょうか。私が持っている例:

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

アトリビューションタグを簡単に受け取ることができるようですが、この時点でそれを書き込む必要がありますNSMutableArrayNSDictionary

NSMutableDictionaryをNSMutableArrayに渡す方法をNSXMLParserで読みましたが、これが最善の方法ですか?

4

2 に答える 2

1

要素にサブ要素の配列が含まれていることがわかっている場合は<list>、そのブロックの先頭に配列または辞書を作成することをお勧めします。

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

これはすべてfontdataitemKey、 などのプロパティがあることを前提としています...基本的に、関連するオブジェクトを作成できるようになるまで、必要なすべての状態を覚えておく必要があります。通常はメソッドで必要なデータを取得したらdidEnd、オブジェクトを作成してどこかに保存し、保存したデータを消去します。

これは、データを解析する唯一の方法ではありません。たとえば、代わりにスタックベースのアプローチを使用することをお勧めします。しかし、上に示したアイデアはおそらく最も理解しやすく、データが複雑すぎなければ管理も難しくありません。

于 2012-04-10T14:52:05.910 に答える
0

タグの内容を取得するには、次を使用します。

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    [element appendString:string];
}

次にチェックインします。

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {

属性を取得するには:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {

    if ([elementName isEqualToString:@"image"]) {
        NSString *imageName = [attributeDict objectForKey:@"tmpl"];
    }

}

于 2012-04-10T10:43:29.573 に答える