1

次のXMLをで解析していますNSXMLParserが、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>

の値のみに基づいてオールplayersインを返すことができるようにしたいので、メソッド に渡す場合は、その1つのノードで見つかったものだけを一意のチェックサムで返したいと思います。XMLには、チェックサムを備えた他のゲームがありますが、チェックサムは常に一意です。gamechecksumchecksumvalue1playersgame

これまでのところ、チェックサム値から要素と属性を読み取るための基本的なパーサーコードがいくつかありますが、そこからどこに行くべきかわかりません。NSXMLNodeまた、XPathを使用すると、これを実現する方が理にかなっているのではないかと思います。

- (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
   }
}

助けてくれてありがとう!

4

1 に答える 1

0

チェックサムをまだ見つけたかどうか、および遭遇したすべてのプレーヤーを追跡する必要があります。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>
于 2013-02-25T07:52:05.957 に答える