Przykład NSXMLParser

Mam taki XML

<IS>
    <Value>
        <Signature>-804</Signature>
        <Amount>139</Amount>
    </Value>
    <Value>
        <Signature>-845</Signature>
        <Amount>639466</Amount>
    </Value>
    <Value>
        <Signature>-811</Signature>
        <Amount>16438344</Amount>
    </Value>
    <Value>
        <Signature>-1115</Signature>
        <Amount>-159733</Amount>
    </Value>
</IS>

Teraz chcę analizować tylko konkretne wartości z tego. Na przykład, jak uzyskać wartość dla węzła o odpowiedniej sygnaturze jako -804

Proszę, pomóż mi..

Znam podstawy NSXMLParser, ale nie wiem, jak osiągnąć warunkowe parsowanie.

Dziękuję.
Author: testndtv, 2011-01-16

3 answers

- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
    currentKey = nil;
    [currentStringValue release];
    currentStringValue = nil;
    if([elementName isEqualToString:@"Value"]){
        //alloc some object to parse value into
    } else if([elementName isEqualToString:@"Signature"]){
        currentKey = @"Signature";
        return;
    }
}

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
    if(currentKey){
        if(!currentStringValue){
            currentStringValue = [[NSMutableString alloc] initWithCapacity:200];
        }
        [currentStringValue appendString:string];
    }
}

-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
    if([elementName isEqualToString:@"Signature"] && [currentStringValue intValue] == 804){
        ivar.signature = [currentStringValue intValue];
        return;
    }
}
Coś w tym stylu. Uwaga nie testowałem tego kodu na kompilatorze, więc będą błędy składni tutaj i tam.
 10
Author: Asad Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-17 15:31:37

Możesz przyjrzeć się użyciu TouchXML- https://github.com/mrevilme/TouchXML który oferuje kilka ładnych funkcji obsługi XML, w tym Korzystanie z XPATH, co sprawia, że to, co próbujesz zrobić, jest znacznie prostsze.

Hipotetyczny przykład oparty na twoim modelu:

//first, load an XML document
CXMLDocument *xmlDoc = [[CXMLDocument alloc] initWithXMLString:someXMLString options:0 error:&error];

//get node
CXMLNode *amountNode = [xmlDoc nodeForXPath:@"//Value[@Signature='-804']/Amount" error:&error];

//or get actual value of node
NSSString *amountString =  = [[xmlDoc nodeForXPath:@"//Value[@Signature='-804']/Amount" error:&error] stringValue];

Uwaga: żaden z tych exapmle nie jest testowany.

Uważam, że TouchXML jest bardzo przydatny i kompaktowy.

Mam nadzieję, że to pomoże.
 6
Author: dredful,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-18 19:30:56

Istnieją dwa podejścia do parsowania XML-podejście oparte na zdarzeniach (takie jak używane przez NSXMLParser) i podejście drzewiaste (takie jak używane przez NSXML).

Jeśli jesteś tylko po konkretnych elementach, to prawdopodobnie byłoby o wiele łatwiej użyć podejścia drzewa używanego przez NSXML, ponieważ pozwoli Ci to na odpytywanie dokumentów XML za pomocą XPath (a nawet XQuery), aby zwrócić określone węzły itp. to Cię interesuje.

Jeśli to brzmi, może to być bardziej owocne podejście to, że używając NSXMLParser do iteracji całej struktury, polecam przeczytać Introduction to Tree-Based XML Programming Guide for Cocoa . (Szczególnie interesująca powinna być sekcja "odpytywanie dokumentu XML".)

 4
Author: John Parker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-16 13:41:44