NSXMLParser:解析基于另一个元素的指定元素
问题描述:
我正在解析下面的XML与NSXMLParser
,但希望仅根据XML中找到的唯一元素解析某些元素和属性,然后中止解析。NSXMLParser:解析基于另一个元素的指定元素
例如,我的XML看起来是这样的:
<?xml version="1.0" encoding="UTF-8"?>
<systems>
<system id="system1">
<game title="game1">
<checksums>
<checksum value="checksumvalue1" />
</checksums>
<players>
<player name="name1" description="description1" />
<player name="name2" description="description2" />
</players>
</game>
</system>
我希望能够返回game
所有players
只是对checksum
值基于所以,如果我通过checksumvalue1
到我的方法,我想只返回在那个game
节点中发现的players
与唯一的校验和。在XML中,将会有其他带有校验和的游戏,但校验和总是唯一的。
到目前为止,我有一些基本的解析器代码,只是从校验和值中读取元素和属性,但我不知道该从哪里去。我也想知道XPath的NSXMLNode
是否更有意义。
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict{
if ([elementName isEqualToString:@"checksum"] && [[attributeDict valueForKey:@"value"] isEqualToString:@"checksumvalue1"]) {
NSString *checksumValue = [attributeDict valueForKey:@"value"];
NSLog(@"value: %@", checksumValue);
// print players in only one game node that contains the unique checksum value
}
}
感谢您的帮助!
答
你必须跟踪你是否已经找到了校验和以及你所遇到的所有玩家。您需要布尔型foundGameChecksum
和NSMutableArray* players
。不要忘了players = [[NSMutableArray alloc] init];
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict{
if ([elementName isEqualToString:@"checksum"] && [[attributeDict valueForKey:@"value"] isEqualToString:@"checksumvalue1"]) {
NSString *checksumValue = [attributeDict valueForKey:@"value"];
NSLog(@"value: %@", checksumValue);
foundGameChecksum = YES;
// print players in only one game node that contains the unique checksum value
} else if(foundGameChecksum && [elementName isEqualToString:@"player"]) {
[players addObject:[attributeDict valueForKey:@"name"]];
}
}
- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName
{
if(foundGameChecksum && [elementName isEqualToString:@"players"]) {
[parser abortParsing]; // Stop parsing
}
}
执行[parser parse];
然后你就会有玩家在players
即:
<?xml version="1.0" encoding="UTF-8"?>
<systems>
<system id="system1">
<game title="game1">
<checksums>
<checksum value="checksumvalue1" /> <!-- Found. Start adding -->
</checksums>
<players>
<player name="name1" description="description1" /> <!-- Add -->
<player name="name2" description="description2" /> <!-- Add -->
</players> <!-- Stop adding -->
</game>
</system>
</systems>
完美!谢谢 – brymaster 2013-02-25 08:04:55
有一件事,是否有任何我需要放弃的地方,在它已经找到所有玩家之后继续下去?看起来它仍然会解析整个XML,即使它找到了播放器并将它们全部添加到数组中。 – brymaster 2013-02-25 08:33:22
找到[另一个问题]的答案(http://stackoverflow.com/questions/6340731/easy-way-to-cancel-current-nsxmlparser-parsing-operation)'[解析器abortParsing];'我编辑了我的答案。 – Ric 2013-02-25 08:37:50