2012-04-19 4 views
1

私の質問はかなり簡単です。私はXMLを解析しており、解析手順はNSXMLでかなりうまくいった。私はいくつかの配列のすべての声を入れて、今ではそれで文字列を構成しています。私がしようとしていたObjective-C - NSXMLはどこに行かないのですか?

Text 01 
Text 02 

:私の問題は...私はこのようにXMLを記述する場合、その

<main> 
    <introductions> 
    <text>Text 01</text> 
    <text>Text 02</text> 
    </introductions> 
</main> 

です...と私は、私が入手ストーリーボード上のラベルで2つの文字列を追加します把握するために、新しい行がから来たので、私はいくつかのことをしようと、私は、このXMLが...

<main> 
    <introductions> 
    <text>Text 01</text> <text>Text 02</text> 
    </introductions> 
</main> 

... ...

を生成することを発見した場合

これはなぜですか?なぜNSXMLがタグの外にあるものを読み込んでいるのですか?どうすればこれを避けることができますか?

ことができますすることができた場合、それは私がパーサを初期化する方法は次のとおりです。

NSURL *xml = [NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"frasi" ofType:@"xml"]]; 
xmlParser = [[NSXMLParser alloc] initWithData:[NSData dataWithContentsOfURL:xml]]; 
[xmlParser setDelegate:self]; 
[xmlParser setShouldProcessNamespaces:NO]; 
[xmlParser setShouldReportNamespacePrefixes:NO]; 
[xmlParser setShouldResolveExternalEntities:NO]; 
[xmlParser parse]; 

そしてこれが(私の本当のXMLのための)残りのコードです:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName 
    namespaceURI:(NSString *)namespaceURI 
    qualifiedName:(NSString *)qName 
    attributes:(NSDictionary *)attributeDict{ 
    currentElement = [elementName copy]; 

    if ([currentElement isEqualToString:@"introduzioni"] || [currentElement isEqualToString:@"soggetti"] 
     || [currentElement isEqualToString:@"verbi"] || [currentElement isEqualToString:@"luoghi"]){ 
     ++depth; 
     //[self showCurrentDepth]; 
     NSLog(@"Sezione %@", elementName); 
     sezione = [[NSString alloc] init]; 
     sezione = currentElement; 
    } 
    else if ([currentElement isEqualToString:@"testo"]){ 
     currentName = [[NSMutableString alloc] init]; 
    } 
} 

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

    if ([elementName isEqualToString:@"introduzioni"] || [elementName isEqualToString:@"soggetti"] 
     || [elementName isEqualToString:@"verbi"] || [elementName isEqualToString:@"luoghi"]){ 
     --depth; 
     //[self showCurrentDepth]; 
    } 
    else if ([elementName isEqualToString:@"testo"]){ 
     if (depth == 1){ 
      NSLog(@"Testo: %@", currentName); 
      if([sezione isEqualToString:@"introduzioni"]) 
       [arrayIntroduzioni addObject:currentName]; 
      if([sezione isEqualToString:@"soggetti"]) 
       [arraySoggetti addObject:currentName]; 
      if([sezione isEqualToString:@"verbi"]) 
       [arrayVerbi addObject:currentName]; 
      if([sezione isEqualToString:@"luoghi"]) 
       [arrayLuoghi addObject:currentName]; 
     } 
    } 
}   

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{ 
    if ([currentElement isEqualToString:@"testo"]){ 
     [currentName appendString:string]; 
    } 
} 

+0

私たちにいくつかのコードを見せてください。テキスト値を追加する方法とその読み方 – Lefteris

+0

@Lefteris:コードが大量であり、XMLが問題のために特別なサンプルになっているので、かなり難しいです。私はそれに合うようにすべてのコードを再度変更する必要があります。私は構文解析が大丈夫であることを保証することができます。私はちょうど "stringAppendByString"を使用して文字列を追加し、私は期待していない間にXMLを変更するように動作が変化します。それは問題です...ところで、私はあなたを助けるかもしれないコードをいくつか追加しようとします。 –

+0

アルベルトあなたは、コードなしであなたを助けることがさらに困難であると推測できます。コード全体を表示するのではなく、コード全体を表示してください。 – Lefteris

答えて

1

デリゲートメソッドparser:foundCharacters:は、すべての文字データ、つまりあなたが探しているデータとタグ間のすべての空白文字を配信します。

第閉鎖</text>と第2の開口<text>との間の空白が受信されると、変数currentElementまだ"testo"を含んでいます。パーサは、あなたが興味を持っているタグの外側にあるにもかかわらず、あなたはcurrentNameに空白(改行)を追加します。

それを修正するためには、あなたはそのようにそれを設定すると(currentElementのためのより良いハンドリングを必要としますか各終了タグの後にはnilまで)、スタックの深さをさらに確認する必要があります。

+0

ありがとうございます。ちょっと別の質問です...どのように私は各終了タグの後に 'nil'に 'currentElement'を設定するのですか? –

+0

@AlbertoSchiariti:単に 'currentElement = nil;'を 'parser:didEndElement:'のどこかに入れてください。 – Codo

関連する問題