2011-04-07 72 views
2

解析XML,我有以下XML:如何使用的NSXMLParser

<?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> 

我怎样才能得到元素要的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" ]; 
    } 
    } 

但它是错误的

现在我用同一代码:

- (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]; 
} 

但我对视空标贴...

+1

你试过了什么代码?你究竟在哪里遇到麻烦? SO反对“给我代码”职位。 – Amy 2011-04-07 04:37:00

+0

我不明白如何添加到NSMutableDictionary元素 – Ruslan 2011-04-07 04:49:38

+0

到目前为止您尝试过的并不完美,但这是一个好的开始。但是,您需要实现更多的NSXMLParserDelegate方法,并使listOfFriends属性成为可能。 – 2011-04-07 04:56:05

回答

5

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

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

self.listOfFriends = [NSMutableDictionary dictionary]; 

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

self.thisString = [NSMutableString string]; 

在您的-parser:foundCharacters:方法中,将字符串追加到mutable你之前创建的字符串属性。

[self.thisString appendString:string]; 

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

如果刚刚结束的元素是消息,其与-setValue:forKey:传递元素名称作为键添加到字典中,和您在早些时候接受-parser:foundCharacters:消息作为价值创造的建成字符串。

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