2012-03-13 7 views
0

NSXMLParserを使用してリモートサーバーからXMLを解析する際に問題が発生しました。 XML-構造は次のようになります。NSXMLParser:iOSアプリケーションで2レベルの深さのXMLを解析します。

<data> 
    <sale id="example01"> 
     <article> 
      <id>123</id> 
      <title>Some title</title> 
      <teaser>Some text</teaser> 
     </article> 
     <article> 
      <id>124</id> 
      <title>Some title</title> 
      <teaser>Some text</teaser> 
     </article> 
    </sale> 
    <sale id="example02"> 
     <article> 
      <id>125</id> 
      <title>Some title</title> 
      <teaser>Some text</teaser> 
     </article> 
     <article> 
      <id>126</id> 
      <title>Some title</title> 
      <teaser>Some text</teaser> 
     </article> 
    </sale> 
</data> 

私は正常にXMLを解析され、私のCoreDataModelにそれを格納しますが、パーサは唯一の内の最初の「売却」の要素との記事をつかむように思えます。 次の「販売」要素になると、パーサーはエラーなく停止します。 XMLからのリモートデータの解析にNSXMLParserを使用することがよくありますが、この問題を解決する方法を見つけることはできません。 Salesから属性を取得することが重要です。なぜなら、 "sale"要素がセクションを表し、アーティクルがセルを定義するTableViewを作成する必要があるからです。

ドキュメントには、ルート要素は1つしか存在できませんが、ルート要素はありません。

EDIT#1: ここでは、私が使用するコードの一部です:

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


    // If it's the start of the XML, remove everything we've stored so far 
    if([elementName isEqualToString:@"daten"]) 
    { 
     [self emptyDataContext]; 
    } 

// Create a new Article 

    NSLog(@"Processing Element: %@", elementName); 

    if ([elementName isEqualToString:@"article"]) 
    { 
     appDelegate.saleArticles = [[NSMutableArray alloc] init]; 
     currentArticle = (Verkauf *)[NSEntityDescription insertNewObjectForEntityForName:@"Verkauf" inManagedObjectContext:managedObjectContext]; 

     return; 
    } 
} 

設定要素値:

"Verkaufは、" 私のCoreDataModelでニュース-EntitiyにバインドされたDataObjectです

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

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

    NSLog(@"Processing Value: %@" ,currentElementValue); 

} 

は、要素の値を設定し、CoreDataモデルに追加します。

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

    // !!! This is never called !!! 
    if([elementName isEqualToString:@"sale"]){ 
     NSLog(@"!!!!!!!!!!!!!!Section End!!!!!!!!!!!!!!!!!!!!!!!"); 
     return; 
    } 

    // If we're at the end of a county. Save changes to object model 
    if ([elementName isEqualToString:@"article"]) 
    { 
     [appDelegate.saleArticles addObject:currentArticle]; 
     // Sanity check 
     if(currentArticle != nil) 
     { 
      NSError *error; 

      // Store what we imported already 
      if (![managedObjectContext save:&error]) { 

       // Handle the error. 
       NSLog(@"%@", [error domain]); 
      } 
     } 
     return; 
    } 
    else if([elementName isEqualToString:@"teaser"]){ 
     [currentArticle setTeaser:currentElementValue]; 
    } 

    else if(..... }; 

EDIT#2: 私の初期化方法:

- (BOOL)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error 
{ 
    BOOL result = YES; 

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL]; 
    // Set self as the delegate of the parser so that it will receive the parser delegate methods callbacks. 
    [parser setDelegate:self]; 
    // Depending on the XML document you're parsing, you may want to enable these features of NSXMLParser. 
    [parser setShouldProcessNamespaces:NO]; 
    [parser setShouldReportNamespacePrefixes:NO]; 
    [parser setShouldResolveExternalEntities:NO]; 

    [parser parse]; 

    NSError *parseError = [parser parserError]; 
    if (parseError && error) { 
     *error = parseError; 
     result = NO; 
    } 

    // deactivated because of ARC 
    // [parser release]; 

    return result; 
} 
+0

おそらくコードの一部を投稿する必要があります。私が見る限り、XMLについて何も奇妙なことはありません。 –

答えて

0

(私はあなたがおそらくXMLをAnglicisedきたことに注意が)私はあなたのコードやXMLのいずれかに何も表示されませんので、私のどちらかがそれを逃した(おそらく)か、それは変だ。

NSXMLParserは、あなたが提供した以上の情報を提供します。 parseメソッドはBOOLを返します。それは何を返すのですか? NOの場合は、parserErrorメソッドを使用して、より多くの情報を提供するNSErrorオブジェクトを取得できます。

+0

私は既にinitでparserErrorを宣言しました。あなたは今質問の中にコードを見つけることができます。 – DevZarak