0

私はiPhoneアプリケーションプログラミングの初心者です。XMLファイルから値を取得してUITableViewに表示できません。動物の名前の値を取得する必要があります。属性なしでXMLを解析する簡単な方法はどうですか?NSXMLParserのドキュメントを読みましたが、データがUITableViewに表示されません。これが私のXMLファイルです:

<?xml version="1.0" encoding="UTF-8"?>
<animals>
  <animal>
    <id>1</id>
    <name>Elephant</name>
  </animal>
  <animal>
    <id>2</id>
    <name>Tiger</name>
  </animal>
  <animal>
    <id>3</id>
    <name>Bird</name>
  </animal>
</animals>

属性を使用したXMLの解析に関するチュートリアルに従いますが、XMLファイルに属性がありません。そしてこれはXMLを解析するための私のコードです:

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

     if([elementName isEqualToString:@"animals"]) {
      appDelegate.animals = [[NSMutableArray alloc] init];
     }

     else if([elementName isEqualToString:@"animal"]) {  
     }

        else if([elementName isEqualToString:@"id"]){
      aAnimal = [[Animal alloc] init];
      aAnimal.animalID = elementName;
     } 
    }

    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 

     if(!currentElementValue) 
      currentElementValue = [[NSMutableString alloc] initWithString:string];
     else
      [currentElementValue appendString:string]; 
    }

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

     if([elementName isEqualToString:@"animals"])
      return;
     else if([elementName isEqualToString:@"animal"]) {
     }
        else if([elementName isEqualToString:@"id"]) {
      [appDelegate.animals addObject:aAnimal];      
      [aAnimal release];
      aAnimal = nil;
     }
     else 
      [aAnimal setValue:currentElementValue forKey:elementName];

     [currentElementValue release];
     currentElementValue = nil;
    }
4

2 に答える 2

0

ReaddyEddy が述べたように、パーサーの foundCharacters デリゲートを設定して、現在の文字列を保存する必要があります。したがって、次のようになります。

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (!currentStringValue) {
    // currentStringValue is an NSMutableString instance variable
    currentStringValue = [[NSMutableString alloc] initWithCapacity:50] ; // +1
}

NSString *tempString = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
if ([tempString length] > 0) {
    [currentStringValue appendString:tempString] ;
}

}

次に、パーサーの didEndElement で、目的のタグと一致するように要素名を確認する必要があります。次に、currentStringValue を保存します。

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

if ( [elementName isEqualToString:@"id"]) {
    self.id = currentStringValue ;
}

if ( [elementName isEqualToString:@"name"]) {
    self.name = currentStringValue ;
}

}

私は通常、foundCharacters を baseModel.m というクラスに配置します。次に、他のすべてのモデルにそれを継承させます。そして、それぞれの継承は、独自のパーサーの didEndElement メソッドを実装するだけです。アニマルとアニマルの場合、2 つのモデルも用意します。1 つはアニマル、もう 1 つはアニマルで、Animals.m でタグ Animal を探し、アニマル オブジェクトを作成します (そこで行ったように)。しかし、次に、デリゲートを新しく作成した Animal オブジェクトに設定し、Animal モデルに独自の解析を処理させます。ただし、その場合は、それぞれの終了タグを確認し、デリゲートを親に戻す必要があります。

于 2010-03-02T23:19:46.950 に答える
0

非常に一般的な問題です。解決策の例は、Apple のサンプル XMLPerformance の CocoaXMLParser で、質問に答えています。基本的に、文字データの収集を制御するブール値とそれを保持する文字列を定義し、文字列をどこかで初期化してください。

- (void)parser:(NSXMLParser *)parser didStartElement 以下で変数をインスタンス化します。

  • (void)parser:(NSXMLParser *)parser didEndElement

キャラクターを集める:

  • (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { if (storingCharacters) [currentString appendString:string]; }
于 2010-02-06T19:47:09.167 に答える