如何使用NSXMLParser解析XML

Rus*_*lan 2 xml cocoa parsing cocoa-touch ios4

我有以下xml:

<?xml version="1.0" encoding="UTF-8"?>
<Message>
    <Text>Town park travel</Text>
    <Theme>Ready for racing?</Theme>
    <Activate_date>2011-03-08</Activate_date>
    <Login>Simon</Login>
    <Name>Simon </Name>
    <Longitude>46.00339</Longitude>
    <Latitude>51.515381</Latitude>
</Message>
Run Code Online (Sandbox Code Playgroud)

如何获取元素到NSMutableDictionary?

我试过了

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{            
if ([elementName isEqualToString:@"Message"]){
    listOfFriends = [[NSMutableDictionary alloc] init];
    if ([elementName isEqualToString:@"text"]) {
        [listOfFriends setObject: elementName forKey @"text" ];
    }
    }
Run Code Online (Sandbox Code Playgroud)

但这是错误的

现在我使用相同的代码:

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{            
if ([elementName isEqualToString:@"Message"]){
    listOfFriends = [[NSMutableDictionary alloc] init];
} else if ([elementName isEqualToString:@"Text"] || [elementName isEqualToString:@"Theme"] || [elementName isEqualToString:@"Activate_date"] || [elementName isEqualToString:@"Login"] || [elementName isEqualToString:@"Longitude"] || [elementName isEqualToString:@"Latitude"]) {
    [currentElement setString:@""];
    storingCharacters = YES;
}
}   

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elementName isEqualToString:@"Message"]) {
    [listOfFriends release];
} else if ([elementName isEqualToString:@"Text"]) {
    txt.text = currentElement;
} else if ([elementName isEqualToString:@"Theme"]) {
    theme.text = currentElement;
} else if ([elementName isEqualToString:@"Activate_date"]) {
    aDate.text = currentElement;
} else if ([elementName isEqualToString:@"Login"]) {
    autor.text = currentElement;
} 
storingCharacters = NO;
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if (storingCharacters) [currentElement appendString:string];
}
Run Code Online (Sandbox Code Playgroud)

但我看到空的Lables ......

She*_*ley 5

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

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

self.listOfFriends = [NSMutableDictionary dictionary];
Run Code Online (Sandbox Code Playgroud)

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

self.thisString = [NSMutableString string];
Run Code Online (Sandbox Code Playgroud)

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

[self.thisString appendString:string];
Run Code Online (Sandbox Code Playgroud)

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

如果刚刚结束的元素不是 Message,则将-setValue:forKey:元素名称作为键添加到字典中,并将接收早期-parser:foundCharacters:消息时创建的组合字符串作为值.

[self.listOfFriends setValue:self.thisString forKey:elementName];
Run Code Online (Sandbox Code Playgroud)