Ios NSXMLParser:基于另一个元素解析特定元素
我正在使用Ios NSXMLParser:基于另一个元素解析特定元素,ios,objective-c,xml-parsing,nsxmlparser,Ios,Objective C,Xml Parsing,Nsxmlparser,我正在使用NSXMLParser解析以下XML,但只希望基于XML中找到的唯一元素解析某些元素和属性,然后中止解析 例如,我的XML如下所示: <?xml version="1.0" encoding="UTF-8"?> <systems> <system id="system1"> <game title="game1"> <checksums> <checksum value="
NSXMLParser
解析以下XML,但只希望基于XML中找到的唯一元素解析某些元素和属性,然后中止解析
例如,我的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>
谢谢你的帮助 你必须跟踪你是否找到了校验和以及你遇到的所有玩家。您需要一个布尔值
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
即:
有一件事,在找到所有玩家后,我是否需要在哪里中止Parsion?看起来即使找到了玩家并将他们全部添加到数组中,它仍然会解析整个XML代码>我已经编辑了我的答案。我认为在这一步中,玩家加入arraySorry会被打断,引入了一个bug。现在应该修好了。
- (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
}
}
<?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>