的NSXMLParser未完成文件

问题描述:

我解析XML文件在我的应用程序和最奇怪的事情发生了。它在多个元素之后停止,不完成该元素,但解析方法仍然返回成功。我有感觉这是一个错误的人物,但无法弄清楚。有没有人知道为什么它在解析过程中暂停。为什么,如果它没有完成文件,它会返回真正的解析?的NSXMLParser未完成文件

文件解析:

MOOAnimal *soort; 
NSString *currentElementValue; 


- (void) getData 
{ 
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"soorten" ofType:@"xml"]; 

    NSURL *xmlUrl = [NSURL fileURLWithPath:filePath]; 

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:xmlUrl]; 

    [parser setDelegate:self]; 

    BOOL succes = [parser parse]; 


    if(succes) 
    { 
     data = true; 
     beestjes = [NSArray arrayWithArray:soorten]; 
    } 


} 

- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    if([elementName isEqualToString:@"soorten"]) 
    { 
     soorten = [[NSMutableArray alloc] init ]; 
    } 
    else if([elementName isEqualToString:@"soort"]) 
    { 
     soort = [[MOOAnimal alloc] init]; 
    } 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string { 
    currentElementValue = nil; 
    currentElementValue = [[NSString alloc] initWithString:string]; 
    NSLog(@"Naam: %@", currentElementValue); 
} 

- (void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    if([elementName isEqualToString:@"soorten"]) 
    { 

    } 
    else if([elementName isEqualToString:@"soort"]) 
    { 
     [soorten addObject: soort]; 
     soort = nil; 
    } 
    else if([elementName isEqualToString:@"nl"]) 
    { 
     [soort setName:currentElementValue]; 

    } 
} 

XML文件:

<soorten> 
<soort><wormscode>117644</wormscode><localnames><nl>Ruwe zeerasp </nl></localnames><latinname>Hydractinia echinata </latinname><omschrijving></omschrijving><opmerkingen></opmerkingen></soort> 
<soort><wormscode>231751</wormscode><localnames><nl>Haringgraat </nl></localnames><latinname>Halecium halecinum </latinname><omschrijving></omschrijving><opmerkingen></opmerkingen></soort> 
<soort><wormscode>117273</wormscode><localnames><nl>Lampenkapje </nl></localnames><latinname>Aequorea vitrina</latinname><omschrijving></omschrijving><opmerkingen></opmerkingen></soort> 
<soort><wormscode>125333</wormscode><localnames><nl>Dodemansduim </nl></localnames><latinname>Alcyonium digitatum</latinname><omschrijving></omschrijving><opmerkingen></opmerkingen></soort> 
<soort><wormscode>283798</wormscode><localnames><nl>Viltkokeranemoon </nl></localnames><latinname>Cerianthus lloydii </latinname><omschrijving></omschrijving><opmerkingen></opmerkingen></soort> 
<soort><wormscode>100803</wormscode><localnames><nl>Rode paardeanemoon </nl></localnames><latinname>Actinia equina </latinname><omschrijving></omschrijving><opmerkingen></opmerkingen></soort> 
<soort><wormscode>100834</wormscode><localnames><nl>Zeedahlia </nl></localnames><latinname>Urticina felina</latinname><omschrijving>- Doorsnede van de zuil en de voetschijf niet groter dan 10 tot 15 cm. De hoogte circa 6 cm. De tentakels tot 2 cm hoog. 
- Een Zeedahlia is een grote brede zeeanemoon met korte dikke tentakels. 
- Kenmerkend is de helder gekleurde tekening op de mondschijf. Deze bestaat uit dubbele lijnen die vanaf de mond gezien vóór de tentakels beginnen. 
- Vrijwel alleen op hard substraat zoals stenen maar soms ook op veen of onder veenranden. Af en toe op pontons. De soort wordt aangetroffen vanaf iets boven de laagwaterlijn tot diepten van 15 meter en meer. 
- Algemeen in het Nederlandse zoute water.</omschrijving><opmerkingen></opmerkingen></soort> 
<soort><wormscode>100872</wormscode><localnames><nl>Golfbrekeranemoon </nl></localnames><latinname>Diadumene cincta</latinname><omschrijving></omschrijving><opmerkingen></opmerkingen></soort> 
<soort><wormscode>395099</wormscode><localnames><nl>Groene golfbrekeranemoon </nl></localnames><latinname>Haliplanella lineata</latinname><omschrijving></omschrijving><opmerkingen></opmerkingen></soort> 
</soorten> 

凡摊位(通过登录发现所有的数据/字符)

2012-06-07 10:49:31.654 MOOFormulier[27852:f803] Naam: 
2012-06-07 10:49:31.654 MOOFormulier[27852:f803] Naam: 283798 
2012-06-07 10:49:31.655 MOOFormulier[27852:f803] Naam: Viltkokeranemoon 
2012-06-07 10:49:31.655 MOOFormulier[27852:f803] Naam: Cerianthus lloydii 
2012-06-07 10:49:31.655 MOOFormulier[27852:f803] Naam: 
2012-06-07 10:49:31.656 MOOFormulier[27852:f803] Naam: 100803 
2012-06-07 10:49:31.656 MOOFormulier[27852:f803] Naam: Rode paardeanemoon 
2012-06-07 10:49:31.657 MOOFormulier[27852:f803] Naam: Actinia equina 
2012-06-07 10:49:31.657 MOOFormulier[27852:f803] Naam: 
2012-06-07 10:49:31.658 MOOFormulier[27852:f803] Naam: 100834 
2012-06-07 10:49:31.658 MOOFormulier[27852:f803] Naam: Zeedahlia 
2012-06-07 10:49:31.659 MOOFormulier[27852:f803] Naam: Urticina felina 
2012-06-07 10:49:31.659 MOOFormulier[27852:f803] Naam: - Doorsnede van de zuil en de voetschijf niet groter dan 10 tot 15 cm. De hoogte circa 6 cm. De tentakels tot 2 cm hoog. 

parser:foundCharacters:你应该追加stringcurrentElementValue,不覆盖整个stri NG。同时登录自己的价值观parser:didEndElement:

NSMutableString *currentElementValue; 
[...] 

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict 
{ 
    currentElementValue = [NSMutableString new]; 
    [...] 
} 

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName 
{ 
    NSLog(@"Element: %@ Value: %@",elementName, currentElementValue); 
    [currentElementValue release]; 
} 

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string 
{ 
    [currentElementValue appendString:string]; 
} 
+0

这的确是anwser的一部分,虽然有人指出,我没有定义的字符集,在这导致它在奇怪的字符绊倒的XML文件的开头。定义字符集解决了我的问题,您的修复确保我确实获得了每个元素的所有数据。 – ophychius

+0

通过实现解析器很容易发现这个错误和其他错误:parseErrorOccurred: –

一位同事谁也调查了这个问题指出,我没有定义字符在文件开头的标签设置。这导致解析器跳过文件中的某些唯一字符。现在这个设置工作正常。

幸得我的同事谁我仍然需要转换为StackOverflow的用户。