【问题标题】:NSXMLParser does not finish fileNSXMLParser 没有完成文件
【发布时间】:2012-06-07 09:01:29
【问题描述】:

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

【问题讨论】:

    标签: ios xml nsxmlparser


    【解决方案1】:

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

    【讨论】:

    • 这确实是 anwser 的一部分,尽管其他人指出我没有在 XML 文件的开头定义字符集,这导致它被奇怪的字符绊倒。定义字符集解决了我的问题,您的修复确保我实际上获得了每个元素的所有数据。
    • 通过实现 parser:parseErrorOccurred: 很容易发现这些错误和其他错误
    【解决方案2】:

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

    感谢我的同事,我仍然需要将他转换为 StackOverflow 用户。

    【讨论】:

      猜你喜欢
      • 2021-02-16
      • 1970-01-01
      • 2010-12-18
      • 2023-04-07
      • 2013-07-13
      • 2011-06-03
      • 2011-06-04
      • 2012-11-11
      • 2011-11-20
      相关资源
      最近更新 更多