2011-01-16 12 views
10

Ho un XML come questoNSXMLParser esempio

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

Ora voglio analizzare solo i valori specifici da questo. Per esempio, come faccio ad ottenere il valore per il nodo avendo firma corrispondente da -804

Please help me ..

so le basi di NSXMLParser, ma non sanno come acheive analisi condizionale.

Grazie.

+0

Sei interessato solo a un elemento specifico, piuttosto che al contenuto del documento nel suo complesso? –

+0

sì, ho bisogno di analizzare solo il valore specifico del nodo (tipo di condizionale come ho detto prima) – testndtv

+0

In questo caso NSXMLParser probabilmente non è la migliore corrispondenza per le tue esigenze - vedi la mia risposta per le informazioni complete. –

risposta

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

Qualcosa come questo. Nota Non ho veramente testato questo codice sul compilatore, quindi qui ci saranno errori di sintassi &.

+0

Questo sembra essere più più facile da implementare. Tuttavia ho una domanda ... In realtà io sto cercando la stringa memorizzata in corrispondente al elemento cioè ho bisogno di ottenere il testo per aver -804 Non sono sicuro se il vostro esempio lo farà. – testndtv

+0

, cioè dovrebbe restituire 139 – testndtv

4

Esistono due approcci per analizzare l'XML: uno basato sugli eventi (come quello utilizzato da NSXMLParser) e un approccio ad albero (come quello utilizzato da NSXML).

Se si seguono solo elementi specifici, sarebbe probabilmente molto più semplice utilizzare l'approccio ad albero utilizzato da NSXML in quanto consentirà di interrogare i documenti XML utilizzando XPath (e in effetti XQuery) per restituire nodi specifici , ecc. che ti interessa.

Se questo sembra un approccio più fruttuoso che utilizza NSXMLParser per scorrere l'intera struttura, ti consigliamo di leggere lo Introduction to Tree-Based XML Programming Guide for Cocoa. (La sezione "Richiesta di un documento XML" dovrebbe essere di particolare interesse.)

+0

Quindi, se uso NSXMLm, posso ottenere l'analisi condizionale come voglio. Hai qualche esempio simile che posso usare come riferimento? – testndtv

+0

@hmthur Se si consulta la sezione "Richiesta di un documento XML" del documento di collegamento sopra riportato, sono inclusi degli esempi di codice. –

+0

Giusto per confermare, quindi NSXML è disponibile su IOS? Vedere http://stackoverflow.com/questions/3447993/how-to-parse-such-kind-of-data-using-nsxml-parsing – testndtv

6

Si consiglia di utilizzare TouchXML - https://github.com/mrevilme/TouchXML che offre alcune interessanti funzioni di gestione XML incluso l'utilizzo di XPATH che rende molto più semplice ciò che si sta tentando di fare.

un esempio ipotetico in base al modello:

//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]; 

Nota: Nessuno di questi exapmles sono testati.

Ho trovato TouchXML molto utile e compatto.

Spero che questo aiuti.