2012-04-19 16 views
1

我的問題很簡單。我正在解析XML,解析過程在NSXML中非常好。我把所有的聲音都放在了一些數組中,現在我正在用這個組合一個字符串。我的問題是,如果我寫這樣的XML ...Objective-C - 讀取新行的NSXML我不會

<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]; 
    } 
} 

+0

給我們看一些代碼。如何添加文本值以及如何閱讀它們 – Lefteris 2012-04-19 09:34:57

+0

@Lefteris:這非常困難,因爲它有很多代碼,並且XML只是爲我的問題特製的一個示例。我不得不再次更改所有代碼以適合它。我可以向你保證解析是好的。我只是使用「stringAppendByString」附加字符串,並在更改XML時改變行爲,但我預料不到。這就是問題......順便說一句,我會嘗試添加一些可能幫助你的代碼。 – 2012-04-19 09:42:49

+0

阿爾貝託你可以猜測,我們更難以在沒有代碼的情況下幫助你。只是向我們展示了代碼片段,而不是整個代碼 – Lefteris 2012-04-19 09:47:12

回答

1

委託方法parser:foundCharacters:將傳遞所有字符數據,即您要查找的數據以及標籤之間的所有空白。

當接收到第一個關閉</text>與第二個開口<text>之間的空白時,變量currentElement仍包含"testo"。所以,你的空白(換行)追加到currentName即使解析器你感興趣以外的標記。

爲了解決這個問題,你要麼需要currentElement一個更好的處理(如設置它至每個結束標記後的nil),否則您需要額外檢查堆棧深度。

+0

謝謝。只是另一個問題,所以......如何在每個結束標籤後將'currentElement'設置爲'nil'? – 2012-04-19 13:14:04

+0

@AlbertoSchiariti:簡單地把'currentElement = nil;'放到'parser:didEndElement:'的某處。 – Codo 2012-04-19 17:50:49