0

这是我的 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
4

3 回答 3

2
WRONG    <countryname>india<countryname>    
RIGHT    <countryname>india</countryname>    

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

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

于 2013-05-27T12:04:48.240 回答
1

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

于 2013-05-27T11:57:00.937 回答
1

您的 XML 无效。你有一个<countryname>标签,但你从不关闭它(即,你错过了/in </countryname>)。

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


顺便说一句,我注意到您似乎在尝试使用一种plist格式,但它并不完全符合正确的格式,就好像您在手动编写 XML 一样。通常,如果您使用plist文件,则根本不需要使用 a 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>

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

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

显然,如果您想学习如何使用NSXMLParser,请继续您的实验。但是在使用文件时,您可以通过仅使用保存和加载plist来简化过程。writeToFiledictionaryWithContentsOfFile

顺便说一句,这个过程不仅适用于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.

有关详细信息,请参阅属性列表编程指南


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

于 2013-05-27T13:19:02.680 回答