Question

J'ai un ensemble d'échantillons de XML retourné:

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

Je veux extraire tout ce qui est <name></name> mais pas les balises elles-mêmes, et d'avoir ce que pour la première instance (ou en fonction d'un autre test de sélectionner quel élément).

Est-ce possible avec regex?

Était-ce utile?

La solution

Le meilleur outil pour ce genre de tâche est 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;

Si vous voulez que le nom du site qui a id 56789, utilisez ce XPath: /rsp/site[id='56789']/name à la place. Je vous suggère de lire W3Schools XPath tutoriel pour un aperçu rapide de la syntaxe XPath.

Autres conseils

<disclaimer>I ne pas utiliser Objective-C</disclaimer>

Vous devez utiliser un analyseur XML , pas regexes . n'est pas une langue régulière, < a href = "https://stackoverflow.com/questions/968919/when-not-to-use-regex-in-c-or-java-c-etc"> ne sont donc pas facilment analysable par Ne pas le faire .

  

Ne jamais utiliser des expressions régulières ou l'analyse des chaînes de base pour traiter XML . Chaque langue d'usage courant a en ce moment parfaitement bon support XML. XML est un standard trompeusement complexe et il est peu probable que votre code sera correct dans le sens où il va analyser correctement les entrées XML tous bien formés, et même si le fait, vous perdez votre temps parce que (comme nous venons de parler) toutes les langues l'utilisation commune a prise en charge XML. Il est non professionnel d'utiliser des expressions régulières pour analyser XML.

Vous pouvez utiliser Expat , avec a liaisons Objective C .

  

options d'Apple sont :

     
      
  1. CF analyseur XML
  2.   
  3. (10.4 uniquement)
  4.   

Sans connaître votre langue ou de l'environnement, voici quelques expressions Perl. Espérons que cela vous donnera la bonne idée de votre application.

Votre expression régulière pour capturer le contenu du texte d'une balise ressemblerait à quelque chose comme ceci:

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

Cette capture le contenu de chaque balise. Vous devrez boucle sur le match pour extraire tout le contenu. Notez que cela ne tient pas compte des étiquettes auto-fin. Vous auriez besoin d'un moteur de regex avec négatifs pour accomplir assertions arrières cela. Sans connaître votre environnement, il est difficile de dire si elle serait prise en charge.

Vous pouvez aussi supprimer simplement tous les tags de votre source en utilisant quelque chose comme:

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

En outre, selon votre environnement, si vous pouvez utiliser une bibliothèque XML-analyse syntaxique, il vous rendra la vie beaucoup plus facile. Après tout, en prenant l'approche regex, vous perdez tout ce que XML vous offre vraiment (données structurées, la sensibilité au contexte, etc.).

Comme d'autres disent, vous devriez vraiment utiliser NSXMLParser pour ce genre de chose.

Cependant, si vous uniquement besoin d'extraire la substance dans les balises de nom, puis RegexKitLite peut le faire assez facilement:

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

Attention espaces de noms:

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

est équivalent XML qui va briser le code en fonction regexp. Pour XML, utilisez un analyseur XML. XPath est votre ami pour des choses comme ça. Le code ci-dessous XPath renvoie une séquence de chaînes avec les informations que vous voulez:

./rsp/site/name/text()

Le cacao a support NSXML XPath.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top