我正在尝试NSXMLParser第一次从XML获取值。但是我有一个问题。
在我的XML下面:
<Library>
<Book>
<ID>1</ID>
<TITLE>Test</TITLE>
</Book>
</Library>
和解析器代码:
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *) elementName namespaceURI:(NSString *)namespaceURI qualifiedNam(NSString *)qName attributes:(NSDictionary *)attributeDict
{
if([elementName isEqualToString:@"Book"])
{
NSLog(@"%@", [attributeDict valueForKey:@"ID"]);
}
}
结果ID为空。你能帮我吗?
最佳答案
不幸的是,NSXMLParser
不能这样工作。它按文档顺序遍历XML中的元素,因此到“ Book”元素开始时,它尚未到达“ ID”元素。如果XML看起来像
<Book Id="1">
...
</Book>
但我想您无法控制XML。然后,您需要一个更复杂的解决方案。我相信以下方法会起作用:
添加这些实例变量
NSString *currentElement, *bookID, *bookTitle;
NSMutableString *elementValue;
实现以下方法:
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *) elementName namespaceURI:(NSString *)namespaceURI qualifiedNam(NSString *)qName attributes:(NSDictionary *)attributeDict {
currentElement = elementName;
elementValue = nil;
}
- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
// Append characters to element value
if (!elementValue) elementValue = [NSMutableString stringWithCapacity:100];
[elementValue appendString:string];
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName {
if ([@"Id" isEqualToString:elementName]) {
bookID = [elementValue copy];
} else if ([@"Title" isEqualToString:elementName]) {
bookTitle = [elementValue copy];
} else if ([@"Book" isEqualToString:elementName]) {
// end of Book element, do something with bookID and bookTitle
}
}
关于ios - NSXMLParser-空值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31515737/