>我有一个文件:
<xml>
<component>something
<system>somethingDeeper
<value>somethingDeepest</value>
</system>
</component>
<component>somethinfDifferent
<value>somethingDifferentDeeper</value>
</component>
<value>somethingNew</value>
</xml>
所以我想区分另一个标签内的内容(例如。 <system>
)什么不是。如何使用 NSXMLParser?我目前使用 BOOL ivar 的,但这是很多标签,这并不像我想要的那么优雅。我知道 NSXMLParser 是一个 SAX 解析器,我理解这一点。
在上面的例子中,我将输入didEndElement
方法三次: elementName
等于value
有没有一种更优雅的方法来区分什么条目和<component>
上面的标签?
您可以保留当前所在的标签名称数组
NSMutableArray *tagNameStack;
每次输入新元素时,都会将其添加到此数组中。每次离开时,您都会再次将其删除。即
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict {
[tagNameStack addObject:elementName];
// Your code here
}
和
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName {
// Your code here
[tagNameStack removeLastObject];
}
因此,当您解析somethingDeepest
您的 tagNameStack 数组将是
@"xml", @"component", @"system", @"value"
您可以使用此堆栈来决定您在 xml 中的位置,即
- (void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string {
if ([tagNameStack containsObject:@"system"]) {
// Deal with the value inside the system tag
} else if ([tagNameStack containsObject:@"component"]) {
// Deal with the value inside the component tag
} else {
// This must be the value inside the XML tag
}
}