Domanda

Ho una serie campione di XML restituito indietro:

<rsp stat="ok">
  <site>
    <id>1234</id>
    <name>testAddress</name>
    <hostname>anotherName</hostname>
    ...

  </site>
  <site>
    <id>56789</id>
    <name>ba</name>
    <hostname>alphatest</hostname>
    ...
  </site>
</rsp>

Voglio estrarre tutto all'interno <name></name> ma non i tag stessi, e di avere che solo per la prima istanza (o in base a qualche altro test di selezionare quale voce).

Questo è possibile con regex?

È stato utile?

Soluzione

Lo strumento migliore per questo tipo di compito è XPath .

NSURL *rspURL = [NSURL fileURLWithPath:[@"~/rsp.xml" stringByExpandingTildeInPath]];
NSXMLDocument *document = [[[NSXMLDocument alloc] initWithContentsOfURL:rspURL options:NSXMLNodeOptionsNone error:NULL] autorelease];

NSArray *nodes = [document nodesForXPath:@"/rsp/site[1]/name" error:NULL];
NSString *name = [nodes count] > 0 ? [[nodes objectAtIndex:0] stringValue] : nil;

Se si desidera che il nome del sito che ha id 56789, utilizzare questo XPath: /rsp/site[id='56789']/name invece. Vi suggerisco di leggere W3Schools XPath tutorial per una rapida panoramica della sintassi XPath.

Altri suggerimenti

<disclaimer>I non utilizzare Objective-C</disclaimer>

Si deve usare un parser XML , non regex . non è un linguaggio regolare , < a href = "https://stackoverflow.com/questions/968919/when-not-to-use-regex-in-c-or-java-c-etc"> quindi non easely leggibile dalla un espressione regolare. Non farlo .

  

Non usare mai le espressioni regolari o parsing stringa di base per elaborare XML . Ogni lingua di uso comune in questo momento ha perfettamente buon supporto XML. XML è uno standard ingannevolmente complesso ed è improbabile il vostro codice sarà corretta nel senso che analizzerà correttamente l'input XML tutto ben formato, e anche se lo fa, stai perdendo il tuo tempo, perché (come appena detto) tutte le lingue Nell'uso comune ha il supporto XML. E 'poco professionale di usare le espressioni regolari per analizzare XML.

Si potrebbe utilizzare Expat , con ha attacchi Obiettivo C .

  

opzioni di Apple sono :

     
      
  1. Il CF XML Parser
  2.   
  3. Il di cacao a base di parser (10.4)
  4.   

Senza conoscere la lingua o l'ambiente, qui ci sono alcune espressioni Perl. Speriamo che vi darà l'idea giusta per la vostra applicazione.

La vostra espressione regolare per catturare il contenuto del testo di un tag sarebbe simile a questa:

m/>([^<]*)</

Questa catturerà il contenuto di ogni tag. Si dovrà ciclo sulla partita per estrarre tutti i contenuti. Si noti che questo non tiene conto di tag auto-terminati. Si avrebbe bisogno di un motore di espressioni regolari con lookbehinds negative per realizzare questo. Senza conoscere il proprio ambiente, è difficile dire se si sarebbe sostenuto.

Si potrebbe anche solo a nudo tutti i tag dalla sorgente usando qualcosa come:

s/<[^>]*>//g

a seconda anche del proprio ambiente, se è possibile utilizzare una libreria XML-analisi, che renderà la vostra vita molto più facile. Dopo tutto, adottando l'approccio regex, si perde tutto ciò che XML davvero (dati strutturati, conoscenza del contesto, ecc).

Offerte

Come altri dire, si dovrebbe davvero utilizzare NSXMLParser per questo genere di cose.

Tuttavia, se si solo necessità di estrarre la roba nei tag di nome, quindi RegexKitLite può farlo abbastanza facilmente:

NSString * xmlString = ...;
NSArray * captures = [xmlString arrayOfCaptureComponentsMatchedByRegex:@"<name>(.*?)</name>"];
for (NSArray * captureGroup in captures) {
  NSLog(@"Name: %@", [captureGroup objectAtIndex:1];
}

Attenzione sugli spazi dei nomi:

<prefix:name xmlns:prefix="">testAddress</prefix:name>

è XML equivalente che si romperà codice basato regexp. Per XML, utilizzare un parser XML. XPath è tuo amico per cose come questa. Il codice XPath seguito restituirà una sequenza di stringhe con le informazioni che si desidera:

./rsp/site/name/text()

cacao ha supporto NSXML per XPath .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top