iphone使用NSXML解析器如何解析属性
问题描述:
我想知道如何在下面的XML文件iphone使用NSXML解析器如何解析属性
<ROOT_ELEMENT><RESPONSE READ_TAG="LEVEL_LIST" RESULT="" TEXT=""/><USER USER_NAME="newadmin01" TOKEN_ID="0.766003221016982" FULL_NAME="newadmin01, newadmin01"/><DATETIME UNFORMATTED_TEXT="Aug 10 2011 12:25PM" FORMATTED_TEXT="10 Aug 12:25"/><BREADCRUMB/><LEVEL_LIST><LEVEL ID="4519" NAME="Mega Mart" CHILD_EXISTS="Y" ADD_EDIT_PRIVILEGE="Y"/></LEVEL_LIST></ROOT_ELEMENT>
这里分析的属性是我的解析器代码
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
elemName = [[NSString alloc] initWithString:elementName];
NSLog(@"element Name = %@", elementName);
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if ([elemName isEqualToString:@"RESPONSE"]) {
if (!currentValueString) {
currentValueString = [[NSMutableString alloc] initWithCapacity:1024];
}
[currentValueString appendString:string];
}
else if ([elemName isEqualToString:@"USER"]) {
if (!currentValueString) {
currentValueString = [[NSMutableString alloc] initWithCapacity:1024];
}
[currentValueString appendString:string];
}
if ([elemName isEqualToString:@"DATETIME"]) {
if (!currentValueString) {
currentValueString = [[NSMutableString alloc] initWithCapacity:1024];
}
[currentValueString appendString:string];
}
else if ([elemName isEqualToString:@"BREADCRUMB"]) {
if (!currentValueString) {
currentValueString = [[NSMutableString alloc] initWithCapacity:1024];
}
[currentValueString appendString:string];
}
else if ([elemName isEqualToString:@"LEVEL"]) {
if (!currentValueString) {
currentValueString = [[NSMutableString alloc] initWithCapacity:1024];
}
[currentValueString appendString:string];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
if ([elemName isEqualToString:@"RESPONSE"]) {
[tableDataArray addObject:currentValueString];
[currentValueString release];
currentValueString = nil;
[elemName release];
elemName = nil;
}
else if ([elemName isEqualToString:@"USER"]) {
[tableDataArray addObject:currentValueString];
[currentValueString release];
currentValueString = nil;
[elemName release];
elemName = nil;
}
else if ([elemName isEqualToString:@"DATETIME"]) {
[tableDataArray addObject:currentValueString];
[currentValueString release];
currentValueString = nil;
[elemName release];
elemName = nil;
}
else if ([elemName isEqualToString:@"BREADCRUMB"]) {
[tableDataArray addObject:currentValueString];
[currentValueString release];
currentValueString = nil;
[elemName release];
elemName = nil;
}
else if ([elemName isEqualToString:@"LEVEL"]) {
[tableDataArray addObject:currentValueString];
[currentValueString release];
currentValueString = nil;
[elemName release];
elemName = nil;
}
}
答
看看NSXMLParserDelegate的消息声明
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict
它有一个你当前解析的元素的attributeDict。
遍历键值对并按照你喜欢的方式处理它们。
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
elemName = [[NSString alloc] initWithString:elementName];
NSLog(@"element Name = %@", elementName);
NSEnumerator *keyEnumerator = attributeDict.keyEnumerator()
// for each element the parser encounters:
// create a new dictionary to hold the attributes
NSMutableDictionary *myAttributes = [[NSMutableDictionary alloc] init];
// go through each attribute for the elementName tag
while ((id aKey = [keyEnumerator nextObject]))
// and store the attribute to the dictionary by copying over the values
[myAttributes setObject:[attributesDict objectForKey:aKey] forKey:aKey];
// after we caught all attributes and copied them into our own data structure
// put them into an instance dicionary to get a structure which holds
// all attributes for any element tag we encounter
// accessible by the elementName as key
[self.attributesByElementDictionary setObject:myAttributes forKey:elementName];
[myAttributes release];
}
实际上,这将产生一个字典的例子! - 响应标签: 字典看起来像:
{
"READ_TAG": "LEVEL_LIST",
"RESULT": "",
"TEXT": ""
}
对于您不会使用平板字典而是形成某种树结构的更通用的解决方案。这是一点点的工作和更强大的 - 但这个小例子应该给你的想法来提取标签的属性并对其进行处理后
你能否解释与例子来支持你的答案,就像使用NSXML解析下面的XML文件解析器。 ROOT_ELEMENT> –
dchiphone