【问题标题】:Error "Error parsing document! " while parsing my XML解析我的 XML 时出现错误“解析文档时出错!”
【发布时间】:2013-05-27 11:53:30
【问题描述】:

这是我的 countries.xml 文件。

有什么问题请回答我,我是 iOS 新手.....

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict/>
<countris>
<country>
    <countryname>india<countryname>    
</country>
</countris>
</plist>

这是我的viewDidLoad

NSString *filename = [[NSBundle mainBundle] pathForResource:@"countris" ofType:@"xml"];
NSData *data = [NSData dataWithContentsOfFile:filename];


NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];

Myparser *myParser = [[Myparser alloc] init];

[parser setDelegate:myParser];

BOOL success = [parser parse];

if (success)
{
    NSMutableArray *users = [myParser arraydata];
    NSString *log= [NSString stringWithFormat:
                          @"This is an array of User objects:\n\n%@",
                          [users description]];
    NSLog(log);
}
else
{
    NSLog(@"Error parsing document!");

    [[[UIAlertView alloc] initWithTitle:nil
                                message:@"Error parsing document!"
                               delegate:nil
                      cancelButtonTitle:@"OK"
                      otherButtonTitles:nil] show];
}

我的 Myparser.m 文件,我在其中实现了我的 NSXMLParserDelegate 协议

#import "Myparser.h"
#import "MyParserData.h"

@implementation Myparser

@synthesize mydata,myparser,arraydata,flag,currentElementValue;

- (id) init {

    if(self = [super init]) {
        currentElementValue = [[NSMutableString alloc] initWithString:@""];
        arraydata = [[NSMutableArray alloc] init];
        flag = FALSE;
    }
    return self;
}

- (void)parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
  namespaceURI:(NSString *)namespaceURI
 qualifiedName:(NSString *)qualifiedName
    attributes:(NSDictionary *)attributeDict {

    if ([elementName isEqualToString:@"countris"]) {
        return;
    } else if ([elementName isEqualToString:@"country"]) {
        self.mydata  = [[MyParserData alloc] init];
         } else {
        self.currentElementValue = [[NSMutableString alloc] init];
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
    if (self.currentElementValue) {
        [self.currentElementValue appendString:string];
    }
}

- (void)parser:(NSXMLParser *)parserdidEndElement:(NSString *)elementNamenamespaceURI:          (NSString *)namespaceURIqualifiedName:(NSString *)qName {

    if ([elementName isEqualToString:@"counteis"]) {

        return;
    }

    if ([elementName isEqualToString:@"country"]) {
        [self.arraydata addObject:mydata];
        self.mydata = nil;
    } else {
        [self.mydata setValue:self.currentElementValue forKey:elementName];
    }

    self.currentElementValue = nil;
}

@end

【问题讨论】:

  • 你的问题是什么?如果您没有具体说明您的问题,我们该如何解决?
  • @manujmv 我认为问题出在问题标题中
  • 感谢您的帮助,我解决了这个问题...

标签: ios nsxmlparser


【解决方案1】:
WRONG    <countryname>india<countryname>    
RIGHT    <countryname>india</countryname>    

这会导致解析器出错,因此会触发错误委托方法。

输出记录与结果无关的解析器内存

【讨论】:

    【解决方案2】:

    您的 XML 无效。您有一个&lt;countryname&gt; 标签,但您从未关闭它(即,您在&lt;/countryname&gt; 中缺少/)。

    在使用NSXMLParser 时,我建议实现parseErrorOccurred,然后查看错误对象,它通常会让您深入了解在XML 源中查找问题的位置。 Cocoa 框架通常非常擅长提供获取错误信息的方法,因此请充分利用这些技术。


    顺便说一句,我注意到您似乎在尝试使用plist 格式,但它并不完全符合正确的格式,就好像您在手动编写 XML 一样。一般来说,如果您使用plist 文件,则根本不需要使用NSXMLParser(也不会手动创建 XML 源)。

    想象一下下面的源代码:

    NSString *docsPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *filename = [docsPath stringByAppendingPathComponent:@"test.plist"];
    
    NSDictionary *dictionary = @{@"countries": @{@"country" : @"india"}};
    [dictionary writeToFile:filename atomically:YES];
    

    这会创建一个test.plist 文件,如下所示:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>countries</key>
        <dict>
            <key>country</key>
            <string>india</string>
        </dict>
    </dict>
    </plist>
    

    问题是,一旦您使用writeToFile 创建了一个 plist,您现在可以将其解读为:

    dictionary = [NSDictionary dictionaryWithContentsOfFile:filename];
    NSLog(@"dictionary = %@", dictionary);
    

    显然,如果您想学习如何使用NSXMLParser,请继续您的实验。但是当使用plist文件时,您可以简化过程,只使用writeToFile保存,dictionaryWithContentsOfFile加载。

    顺便说一句,这个过程不仅适用于NSDictionary 对象,还适用于NSArray 对象。例如考虑这个字典数组:

    // create array plist
    
    filename = [docsPath stringByAppendingPathComponent:@"array.plist"];
    NSArray *array = @[@{@"country" : @"india"}, @{@"country" : @"france"}];
    [array writeToFile:filename atomically:YES];
    
    // read array plist
    
    array = [NSArray arrayWithContentsOfFile:filename];
    

    但想法是您可以将字典和数组保存为 XML 格式,而无需自己接触 XML 源,也不必处理NSXMLParser

    有关详细信息,请参阅Property List Programming Guide


    而且,如果您的数组和字典包含自定义对象,即标准 Cocoa 以外的对象NS 对象(如NSStringNSNumberNSDate 等),还有另一种技术称为@ 987654347@ 和NSKeyedUnarchiver 允许您编写二进制plist 文件,同样使用XML 格式,但同样使您免于自己编写XML 源代码的细节,也无需处理NSXMLParser。它有点复杂,除非您使用自定义类处理数组/字典,否则我不会担心它,但它是另一个很棒的抽象,可以处理 XML 文件而无需处理 XML 本身。

    【讨论】:

    • 谢谢@rob 这对我帮助很大
    【解决方案3】:

    在你的countrys.xml文件中,你似乎没有关闭countryname,而是在一个国家的实际名称之后再次打开它。

    【讨论】:

    • thabks 但我的日志输出给了我“
    猜你喜欢
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多