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 ......
的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)
| 归档时间: |
|
| 查看次数: |
1906 次 |
| 最近记录: |