2011-01-16 11 views
10

Mam XML jak tenprzykład NSXMLParser

<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 określone wartości z tego. Na przykład, w jaki sposób mogę uzyskać wartość dla węzeł mający odpowiedni podpis jako -804

Proszę mi pomóc ..

Znam podstawy NSXMLParser, ale nie wiem jak acheive analizowania warunkowego.

Dziękuję.

+0

Czy interesuje Cię tylko konkretny element, a nie treść dokumentu jako całość? –

+0

tak, potrzebuję parsować tylko określoną wartość węzła (rodzaj warunkowego, jak wcześniej powiedziałem) – testndtv

+0

W takim przypadku NSXMLParser prawdopodobnie nie jest najlepiej dopasowany do twoich wymagań - zobacz moją odpowiedź na pełne informacje. –

Odpowiedz

10
- (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ś takiego. Uwaga Nie przetestowałem tego kodu na kompilatorze, więc będą tam błędy składni tutaj: &.

+0

To wydaje się być bardziej łatwiejsze do wdrożenia. Jednak mam jedno pytanie ... Właściwie szukam ciąg przechowywane w odpowiadającym elementem I.E Potrzebuję uzyskać tekst dla mającą -804 Nie jestem pewien, czy przykład zrobi. – testndtv

+0

, tj. Powinien powrócić 139 – testndtv

4

Istnieją efektywnie dwa podejścia do analizowania XML - oparty na zdarzeniach (taki jak ten używany przez NSXMLParser) i podejście do drzewa (takie jak używane przez NSXML).

Jeśli chodzi tylko o określone elementy, to prawdopodobnie byłoby o wiele łatwiej użyć podejścia drzewiastego używanego przez NSXML, ponieważ umożliwi to zapytanie do dokumentów XML przy użyciu XPath (a nawet XQuery) w celu zwrócenia określonych węzłów itd., które Cię interesują.

Jeśli brzmi to tak, jakby to było bardziej owocne podejście, w którym NSXMLParser służy do iteracji po całej strukturze, polecam lekturę Introduction to Tree-Based XML Programming Guide for Cocoa. (Sekcja "Zapytanie do dokumentu XML" powinna być szczególnie interesująca.)

+0

Więc jeśli używam NSXMLm, mogę uzyskać warunkową analizę, jak chcę. Czy masz jakiś podobny przykład, który mogę wykorzystać jako punkt odniesienia? – testndtv

+0

@hmthur Jeśli spojrzysz na sekcję "Querying a XML Document" dokumentu, do którego link mam powyżej, dołączone są próbki kodu. –

+0

Wystarczy, aby potwierdzić, więc NSXML jest dostępny na IOS? Zobacz http://stackoverflow.com/questions/3447993/how-to-parse-such-kind-of-data-using-nsxml-parsing – testndtv

6

Być może warto przyjrzeć się korzystaniu z TouchXML - https://github.com/mrevilme/TouchXML, który oferuje kilka ładnych funkcji obsługi XML, w tym użycie XPATH, co znacznie upraszcza to, co próbujesz zrobić.

hipotetyczny przykład na podstawie 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 exapmles są testowane.

Znalazłem TouchXML bardzo przydatny i kompaktowy.

Mam nadzieję, że to pomoże.