Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios NSXMLParser:基于另一个元素解析特定元素_Ios_Objective C_Xml Parsing_Nsxmlparser - Fatal编程技术网

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>