1

私の質問はとても簡単です。XML を解析していますが、解析手順は NSXML でうまくいきました。すべての声をいくつかの配列に入れて、それを使って文字列を作成しています。私の問題は、この方法で XML を記述した場合...

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

...そして、取得したストーリーボードのラベルに 2 つの文字列を追加します。

Text 01
Text 02

その新しい行がどこから来たのかを把握しようとしていたので、いくつか試してみたところ、この XML が...

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

...生産...

Text 01 Text 02

なぜこれ?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];
    } 
}

4

1 に答える 1

1

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

</text>最初の終了と 2 番目の開始の間の空白<text>が受信されると、変数にはcurrentElementまだ が含まれています"testo"currentNameしたがって、パーサーが関心のあるタグの外側にある場合でも、空白 (改行) を追加します。

これを修正するには、より適切な処理currentElement(各終了タグの後に設定するなどnil) が必要になるか、スタックの深さをさらに確認する必要があります。

于 2012-04-19T10:56:01.673 に答える