ios - NSXMLParser 未完成文件

标签 ios xml nsxmlparser

我正在我的应用程序中解析 XML 文件,最奇怪的事情发生了。它在多个元素之后停止,没有完成该元素,但解析方法仍然返回成功。我感觉某个地方有一个错误的角色,但无法弄清楚。有谁知道为什么它在解析过程中停止。为什么,如果它没有完成文件,它会返回 true 来完成解析吗?

解析的文件:

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: 中,您应该将 string 附加到 currentElementValue,而不是覆盖整个字符串。还要在 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];
}

关于ios - NSXMLParser 未完成文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10928751/

相关文章:

c++ - 在 ios 编程中包括 c++ 库

ios - 供应配置文件不包括应用程序标识符和钥匙串(keychain)访问组权利

xml - ColdFusion 10 Developer、Tomcat 7.0.64 和多个网站

iphone - 读取本地 XML 文件使 NSXMLParser 返回 NULL

ios - 如何使用 ASIHTTP 解析 XML

ios - 在 UIImageView 中的 ScaleAspectFill 之后计算图像中的位置

ios - 您的规范源都不包含满足依赖项 : Firebase (~> 6. 33.0)、Firebase (= 6.33.0, ~> 6.33.0) 的规范

java - Tomcat 没有执行正确的领域

c# - 如何在 C# 中根据 DTD 验证 XML 文档?

ios - 从NSData获得警告不兼容的指针类型分配给'NSMutableData'