【问题标题】:Problems parsing XML using NSXMLParser使用 NSXMLParser 解析 XML 的问题
【发布时间】:2023-04-01 11:04:02
【问题描述】:

我在解析(显然)正确的 XML 代码时遇到了奇怪的问题!

解析出来的xml是:

<?xml version="1.0" encoding="UTF-8" ?>
<root>
<results>
<file id="0" name="   Linux Ubuntu.rar                                                                  700.64     2" size="700" disp="2"/>
<file id="1" name="   [Soft] Sistema operativo Linux. Live CD Distro Ubuntu-5.04-live-i386.iso          624.926     4" size="5" disp="4"/>
<file id="2" name="   ubuntu-9.04-server-i386.iso                                                       577.220     2" size="9" disp="2"/>
<file id="3" name="   virtualbox-3.1_3.1.2-56127_Ubuntu_karmic_amd64.deb                                 43.578     1" size="3" disp="1"/>
<file id="4" name="   [APP-ITA].UBUNTU.LINUX.iso                                                        586.822     2" size="586" disp="2"/>
<file id="5" name="   Ubuntu linux 2007.iso                                                             700.446     1" size="700" disp="1"/>
<file id="6" name="   Installare aMule Adunanza + Liste Server + Liste Nodi su Ubuntu Gutsy [Fastweb      0.72     5" size="0" disp="5"/>
<file id="7" name="   - Guida Per Linux Ubuntu 7.03 Facile Da Usare!!!!!!!La Prima In Ita.rar           731.351     3" size="7" disp="3"/>
<file id="8" name="   Ubuntu Hacks - Tips and Tools for Exploring, Using, and Tuning Linux (O'Reilly,     3.494     1" size="3" disp="1"/>
<file id="9" name="   Linux-ubuntu-8.04.1-desktop-i386.iso                                              694.498     3" size="8" disp="3"/>
<file id="10" name="   [MANUALE] Ubuntu Linux - Computer Magazine.pdf                                     86.992     2" size="86" disp="2"/>
<file id="11" name="   (Ebook - Ita - Software) Ubuntu - Desktop Guide.pdf                                 0.686     3" size="0" disp="3"/>
<file id="12" name="   Installare Amule Adunanza In Ubuntu.rar                                             0.25     6" size="0" disp="6"/>
<file id="13" name="   UBUNTU LINUX [ITA].PDF                                                              0.536     62" size="0" disp="62"/>
<file id="14" name="   Comandi Fondamentali Ubuntu.rtf                                                     0.67     4" size="0" disp="4"/>
<file id="15" name="   ubuntu Guida.tar                                                                    0.160     1" size="0" disp="1"/>
<file id="16" name="   ubuntu-remix-italiano-8.10.iso                                                    702.720     1" size="8" disp="1"/>
</results>
</root>

NSXMLParser 给我以下错误:

2010-01-13 20:23:22.500 iMule[1419:20b] Error 65, Description: (null), Line: 13, Column: 24
2010-01-13 20:23:22.516 iMule[1419:20b] Error 4, Description: (null), Line: 1, Column: 1

有趣的是,如果我单独解析这些行我没有问题,解析器会大惊小怪!

我的解析代码是:

    // DELEGATE XML PARSER

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName     namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName   attributes:(NSDictionary *)attributeDict{
    if([elementName isEqualToString:@"downloads"] || [elementName isEqualToString:@"results"]){
    NSLog(@"starting or downloads or results");
    if(xmlArray){
        xmlArray= nil;
    }
    self.xmlArray= [[NSMutableArray alloc] init];
    if([elementName isEqualToString:@"results"]){
        [self.results_controller.activity startAnimating];
    }
    if([elementName isEqualToString:@"downloads"]){
        [self.downloads_Controller.activity startAnimating];
    }
}
else if([elementName isEqualToString:@"file"]){
    NSLog(@"found file...");
    [self.xmlArray addObject:attributeDict];
}
}

 - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
NSLog(elementName);
if([elementName isEqualToString:@"downloads"] || [elementName isEqualToString:@"results"]){
    if([elementName isEqualToString:@"downloads"]){
        NSLog(@"downloads found...  reloading table");
        self.downloads_Controller.downloads= xmlArray;
        [self.downloads_Controller.tableView reloadData];
        [self.downloads_Controller.activity stopAnimating];
    }
    else if([elementName isEqualToString:@"results"]){
        NSLog(@"results found... reloading table");
        self.results_controller.results= xmlArray;
//          NSLog(@"xmlarray: %@ and results: %@", xmlArray, self.results_controller.results);
        [self.results_controller.tableView reloadData];
        [self.results_controller.activity stopAnimating];
    }
}
else if([elementName isEqualToString:@"error"]){
    UIAlertView *alert= [[UIAlertView alloc] initWithTitle:@"Error" message:@"aMule dosent seem to be on" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    [alert release];
}
}

- (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError{
NSLog(@"Error %i, Description: %@, Line: %i, Column: %i", [parseError code],
      [[parser parserError] localizedDescription], [parser lineNumber],
      [parser columnNumber]);
 }

- (void)parser:(NSXMLParser *)parser validationErrorOccurred:(NSError *)validError{
NSLog(@"valid: %@", validError);
}


// END DELEGATES XML PARSER

有人知道它可能是什么吗?

谢谢

【问题讨论】:

  • 试过了,不是转义字符,因为我把它们都删除了

标签: iphone xml cocoa nsxmlparser nsxmlparsererrordomain


【解决方案1】:

当你说“单独解析这些行”时,你的意思是你给它一个完整的 XML 文档,只有一个“文件”条目?如果是这种情况,那么另一种方法是使用两个“文件”条目设置 XML 文档,一个带有文件 0 和文件 1,一个带有文件 1 和文件 2,一个带有文件 2 和文件 3,等等,并且查看所有对是否正常工作。根据您将 XML 传递到解析器的方式,您可能会遇到仅在解析 successive 文件条目时出现的问题。

根据您的解析代码的长度,将其添加到原始帖子中会对您有所帮助。

这个简短的程序可以很好地使用 NSXMLParser 解析您提供的数据:

#import <Foundation/Foundation.h>

int main() { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSData *xml = [NSData dataWithContentsOfFile: @"data.xml"];
NSLog(@"xml: %@", [[NSString alloc] initWithData: xml encoding: NSASCIIStringEncoding]);

NSXMLParser *parser = [[NSXMLParser alloc] initWithData: xml];
if (!parser)
    NSLog(@"Unable to initialize parser");
else if ([parser parse])
    NSLog(@"Parsed successfully");
else
    NSLog(@"Parsing failed: %@", [[parser parserError] localizedDescription]);

[pool release];
return 0;

}

【讨论】:

  • 实际上没有从socket解析数据,socket --> NSData --> NSXmlparser。我将添加解析代码
  • 如果我在 python 中解析相同的 xml,我完全没有问题,一切都正确显示! :( 会不会是解析器一次解析这么多数据时遇到问题?有趣的是,在搜索了其他不同的 xml 之后,它总是在同一个地方给出错误!!:( 有什么建议吗?
【解决方案2】:

你查过错误代码吗?

看起来 XML 解析器认为第 13 行的第 24 列需要一些空间。

您能否将 XML 数据发布到 pastebin 中,以便我们查看原始数据?我怀疑您或 Stack Overflow 以某种方式更改了数据(可能是出于格式化原因),这导致 NSXMLParser 报告的行/列号丢失。

【讨论】:

  • 感谢您的帮助。通常它会给我错误 40 和 4 ......但奇怪的是,我在 python 中制作了相同的程序并且数据被完美解析! :( 可能是缓冲区问题吗?搜索“Ubuntu”pastebin.com/m7667fea0 错误:2010-01-16 13:32:25.137 iMule[867:20b] 错误 40,描述:(null),行:34,列: 70
  • 请编辑问题以包含实例化 NSXMLParser 的方法。而且,您应该再次在文档中查找从 NSXMLParser 获得的任何错误代码:developer.apple.com/iphone/library/documentation/Cocoa/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 2012-09-02
  • 1970-01-01
相关资源
最近更新 更多