我有一个像这样的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)"
答案 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]];
通过对代码进行这两项更改,它可以完美运行。
希望这有助于。