6

sub_category である子データを解析して表示しようとしていますが、親カテゴリの関連する sub_category のみを表示します。親要素のデータの解析には成功しましたが、子要素の解析方法に問題があります。

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    if([elementName isEqualToString:@"category"]){
        dataCurrent = [dataFileHolder alloc];
    }
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {

    currentList  = [[NSMutableString alloc] initWithString:[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];

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

    if([elementName isEqualToString:@"name"]){
        dataCurrent.nameOfCat = currentList;
    }
    if ([elementName isEqualToString:@"description"]){
        dataCurrent.descriptionOfCat = currentList;
    }
    if ([elementName isEqualToString:@"image"]) {
        dataCurrent.imageLink = currentList;
    }
    if ([elementName isEqualToString:@"category"]) {
        [listPopulated addObject:dataCurrent];
        dataCurrent = nil;
        currentList = nil;
    }
}

XMLファイルは次のようになります

<category>
        <name>Food</name>
        <description>food description</description>
        <image> Link Here </image>
            <sub_cat>
                <sub_name>Sub name</sub_name>
                <sub_desc>sub cat description</sub_desc>
                <sub_image> Link </sub_image>
            </sub_cat>
            <sub_cat>
                <sub_name>Sub name</sub_name>
                <sub_desc>sub cat description</sub_desc>
                <sub_image> Link </sub_image>
            </sub_cat>
</category>

私はイベント駆動型 XML 解析について調査しており、スレッドxml-parse-only-certain-child-elements の1 つからの参照も見つけましたが、最後に XML と解析についてかなり混乱しています。もっと下手な言葉が必要かもしれません。そして、私の解析部分を行う方法について知りたいです。

4

2 に答える 2

7

ios ネイティブの xml パーサー自体を使用できることを願っています。XML の処理は非常に簡単に見えます。ノードごとにディクショナリを作成し、配列に配置してみてください。最後に、データを簡単に反復できる辞書の配列を取得します。

を作成しNSMutableArray *dataArray & NSMutableDictionary *dataDict & NSMutableDictionary *subcatDict NSMutableArray *subCatArrayNSString.h ファイルにも .h ファイルを作成しますcurrentElement

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    currentElement = elementName;
    if([elementName isEqualToString:@"category"]){
        dataDict = [[NSMutableDictionary alloc] init];
    }
    else if ([elementName isEqualToString:@"sub_cat"]) {
        if(!subCatArray) {
             subCatArray = [[NSMutableArray alloc] init];
        }
        subcatDict = [[NSMutableDictionary alloc] init];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    if(dataDict && !subCatArray){
        [dataDict setObject:string forKey:currentElement];
    }
    else if(subCatArray && subcatDict) {
        [subcatDict setObject:string forKey:currentElement];
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
    if([elementName isEqualToString:@"category"]){
        [dataDict setObject:subCatArray forKey:@"sub_cat"];
        [dataArray addObject:dataDict];
        subCatArray = nil;
        dataDict = nil;
    }
    else if([elementName isEqualToString:@"sub_cat"]){
        [subCatArray addObject:subcatDict];
        subcatDict = nil;
    }
}

これはあなたを助けるでしょう。

于 2013-08-29T15:40:39.570 に答える
0

RaptureXMLなど、サードパーティの XML パーサーのいずれかを試してください。

次に、次のようにデータを解析します。

RXMLElement *rootXML = [RXMLElement elementFromXMLData:yourXMLData];

結果のルート要素をクエリします。

NSLog(@"Category name: %@", [rootXML child:@"name"].text);

[rootXML iterate:@"image.sub_cat" usingBlock: ^(RXMLElement *e) {
    NSLog(@"Sub name: %@", [e child:@"sub_name"].text);
}];    
于 2013-08-29T14:41:16.507 に答える