Pregunta

Tengo un conjunto de muestras de XML devuelto:

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

Quiero extraer todo dentro <name></name> Pero no las etiquetas en sí, y tener eso solo para la primera instancia (o en base a alguna otra prueba, seleccione qué elemento).

¿Es esto posible con Regex?

¿Fue útil?

Solución

La mejor herramienta para este tipo de tarea es 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 desea el nombre del sitio que tiene ID 56789, use este XPath: /rsp/site[id='56789']/name en cambio. Te sugiero que leas Tutorial de W3Schools XPath Para una descripción general rápida de la sintaxis XPath.

Otros consejos

<disclaimer>No uso Objective-C</disclaimer>

Deberías estar usando un Analizador, no regexas. XML no es un idioma normal, Por lo tanto, no es probable por una expresión regular. No lo hagas.

Nunca use expresiones regulares o análisis de cadena básica para procesar XML. Cada idioma en uso común en este momento tiene un soporte XML perfectamente bueno. XML es un estándar engañosamente complejo y es poco probable que su código sea correcto en el sentido de que analizará correctamente todas El uso común tiene soporte XML. No es profesional usar expresiones regulares para analizar XML.

Podrías usar Expatriado, con ha Enlaces de objetivos C.

Las opciones de Apple son:

  1. los Parser CF XML
  2. los Parser de cacao basado en árboles (solo 10.4)

Sin conocer su idioma o entorno, aquí hay algunas expresiones de Perl. Con suerte, le dará la idea correcta para su aplicación.

Su expresión regular para capturar el contenido de texto de una etiqueta se vería algo así:

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

Esto capturará el contenido en cada etiqueta. Tendrá que recorrer el partido para extraer todo el contenido. Tenga en cuenta que esto no tiene en cuenta las etiquetas autominadas. Necesitaría un motor regex con apariencia negativa para lograrlo. Sin conocer su entorno, es difícil decir si sería compatible.

También puede simplemente quitar todas las etiquetas de su fuente usando algo como:

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

Además, dependiendo de su entorno, si puede usar una biblioteca XML-Parsing, hará su vida mucho más fácil. Después de todo, al adoptar el enfoque regex, pierde todo lo que XML realmente le ofrece (datos estructurados, conciencia de contexto, etc.).

Como otros dicen, realmente deberías estar usando NSXMLParser para este tipo de cosas.

Sin embargo, si tu solamente Necesito extraer las cosas en las etiquetas de nombre, luego Regexkitlite puede hacerlo con bastante facilidad:

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

Cuidado con los espacios de nombres:

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

es XML equivalente que romperá el código basado en Regexp. Para XML, use un analizador XML. Xpath es tu amigo para cosas como esta. El código XPath a continuación devolverá una secuencia de cadenas con la información que desea:

./rsp/site/name/text()

Cocoa tiene Soporte NSXML para XPath.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top