0

このような種類の xml で複数の要素 (id1 と id2) を解析する必要があります。

<name>
    <id1>104634449</id2>
    <id2>22014870</id2>
</name>
<name>
    <id1>104634433</id2>
    <id2>220143210</id2>
</name>

私はそのようなコードを使用します:

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI: (NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    isName = [elementName isEqualToString:@"name"];
    isId1 = [elementName isEqualToString:@"id1"];
    isId2 = [elementName isEqualToString:@"id2"];    
    if(isName){
        name = [Name new];
    }
}

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
        if (isName){
            [names addObject:name];
        }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    if (isId1){
        [name setId1:string];
    }
    if (isId2){
        [name setId2:string];
    }
}

ただし、オブジェクト名には 1 つの要素 (id1 または id2) のみが設定されます。私は何を間違っていますか?

デバッグでは、次のようになります: id1 = @"\n" id2 = @"22014870"

4

2 に答える 2

0

問題は、id2を読み終えると、isNameがNOに設定されているため、実際には配列に追加しないことです。

これは一連のアクションです。

  1. name要素が始まります。
  2. id1要素が開始します。
  3. id1要素は終了します。
  4. id2要素が開始します。
  5. id2要素は終了します。
  6. name要素は終了します。

ポイント4で、isNameの最後の割り当てが発生し、次のように設定されます。

isName = [elementName isEqualToString:@"name"];

これはfalseになります。

修正されたコード

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
        if ([elementName isEqualToString: @"name"){
            [names addObject:name];
        }
}
于 2013-01-09T19:50:05.660 に答える
0

XML 解析の奥深くに入る前に、GDataXMLNode (CocoaPod としても利用可能)を使用することを強くお勧めします。

次に、その使用方法のアイデアを得るために、このチュートリアルをチェックしてください。GDataXML を使用して XML ドキュメントを読み書きする方法

これがあなたの質問に直接答えるものではないことはわかっていますが、Google が提供するこのライブラリを使用する方がはるかに簡単です。

于 2013-01-09T19:37:50.813 に答える