0

我有一个这样的 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)"

4

2 回答 2

0

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

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

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];
于 2012-07-26T05:22:52.587 回答
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]];

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

希望这可以帮助。

于 2012-07-26T05:32:18.043 回答