如何使用NSXML Parser解析XML文件

时间:2012-07-26 03:13:39

标签: ios nsxmlparser

我有一个像这样的XML文件,我使用NSXMLParser来解析它:

<? xml version ='1.0' encoding="UFT-8"?>
<!DOCTYPE plist PUBLIC "-//apple//DTD PLIST 1.0//EN" "http://www.apple/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<Data>
   <item>
     <date>2012-07-24</date>
     <name>A</name>
     <count>100</count>
     <startDate>2012-07-24</startDate>
     <stopDate>2012-07-24</stopDate>    
   </item>
   <item>
     <date>2012-07-24</date>
     <name>A</name>
     <count>100</count>
     <startDate>2012-07-24</startDate>
     <stopDate>2012-07-24</stopDate>
   </item>

</Data>
</plist>

使用IBAtion来解析xml文件,如

    - (IBAction)Parser:(id)sender {
    NSXMLParser *xmlParser = [[NSXMLParser alloc]initWithContentsOfURL:[[NSBundle mainBundle]      URLForResource:@"file2" withExtension:@"xml"]];
    [xmlParser setDelegate:self];
    BOOL flag =[xmlParser parse];
    if (flag) {
        NSLog(@"OK");
    } else {
        NSLog(@"false");
    }
    [xmlParser release];
}


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

{
     NSLog(@"%@found a %@ element",self,elementName);
     if ([elementName isEqual:@"Data"]) {
        [data release];
        data = [[Data alloc]init];

    [data setParentParserDelegate:self];
    [parser setDelegate:data];
}

}

printf "OK"而没有printf "NSLog(@"%@found a %@ element",self,elementName)"

2 个答案:

答案 0 :(得分:0)

NSXMLParser是基于流的,当遇到XML流中的特定组件时会向其委托发送各种消息 - 开始标记,文本,结束标记等。因此,创建一个NSXMLParser实例,并为其分配一个符合NSXMLParserDelegate协议的委托。 (编辑:从您添加到问题的代码中,看起来您可能已经完成了这一部分,或者至少在它上面做了一个好的开始。

在您的委托类“-parser:didStartElement:...方法中,检查元素名称。如果它是“Message”,则创建一个新的NSMutableDictionary以将信息保存在其子元素中,并将其存储在属性中:(编辑:在您的代码中,看起来您已经声明了实例变量,但是您应该使用dot-syntax将其作为属性进行访问,以确保发生正确的内存管理。

self.listOfFriends = [NSMutableDictionary dictionary];

对于其他元素名称,创建一个空的NSMutableString,用于保存文本,并将其存储在属性中:

self.thisString = [NSMutableString string];

-parser:foundCharacters:方法中,将字符串附加到您之前创建的可变字符串属性中。

[self.thisString appendString:string];

最后,在您的-parser:didEndElement:...方法中,检查元素名称。如果它是“消息”,那么你已经完成了这个消息元素。如果您的XML流只有一个Message元素(如示例中所示),您现在可以打印您构建的字典,或者您想要用它做的任何其他内容。如果可以有多个Message元素,则可以将刚刚完成的元素添加到数组中。

如果刚刚结束的元素一条消息,请将其添加到字典中,-setValue:forKey:将元素名称作为键,并在接收时创建的构建字符串较早的-parser:foundCharacters:条消息作为值。

[self.listOfFriends setValue:self.thisString forKey:elementName];

答案 1 :(得分:0)

我在你的代码中发现了两个问题:

首先,xml是错误的。第一行应该是:

<?xml version="1.0" encoding="UTF-8"?> 

其次,解析器构造错误。基本上你是以错误的方式初始化URL。它应该是:

NSString *filePath = [[NSBundle mainBundle] pathForResource:@"file2" ofType:@"xml"];
NSXMLParser *xmlParser = [[NSXMLParser alloc]initWithContentsOfURL:[NSURL fileURLWithPath:filePath]];

通过对代码进行这两项更改,它可以完美运行。

希望这有助于。