2010-11-15 7 views
40

Hay un millón de analizadores XML diferentes para el iPhone. Tengo un archivo XML de tamaño mediano que contiene muchas etiquetas duplicadas (en diferentes puntos de la jerarquía). Estaba pensando en TBXML pero estaba preocupado por su falta de soporte XPath. Por ejemplo, digamos que mi archivo XML se veía así.Elección del analizador XML IOS correcto

<blog> 
    <author> foo1 </author> 
    <comments> 

     <comment> 
      <text> 
       <![CDATA[ HTML code that must be extracted ]]> 
      </text> 
      <author>foo2</author> 
     </comment> 

     <comment> 
      <text> 
       <![CDATA[ Here is another post ]]> 
      </text> 
      <author>foo1</author> 
     </comment> 

    </comments> 
</blog> 

Básicamente mis requisitos son que necesito poder extraer esa cdata. Y saber si es el autor del blog un autor de comentarios.

Respuesta

52

mejor comparación que he visto sobre el tema:

http://www.raywenderlich.com/553/how-to-chose-the-best-xml-parser-for-your-iphone-project

La diferencia entre los programas de análisis más lentos y rápidos en su caso era un factor de 2. Dependiendo de los requisitos de características, no son definitivamente analizadores eso puede reducir tu tiempo de análisis a la mitad.

+1

Algunas de las cosas en el artículo están desactualizadas, pero en general siguen siendo muy útiles (solo publicando para que la gente pueda ver que esta respuesta aún es válida a partir de finales de julio) – Cameron

+1

Nota. KissXML se mudó a Github y todavía se actualiza activamente. https://github.com/robbiehanson/KissXML – Eonil

+1

En caso de que alguien quiera volver a ejecutar las pruebas con analizadores actualizados: https://github.com/jansanz/iOSXMLPerformance (también he incluido 2 más que no estaban originalmente en la prueba). –

31

Echa un vistazo RaptureXML. No es un comportamiento XPath oficial, pero es bastante cercano. Su consulta sería:

[rxml iterate:@"comments.comment" with: ^(RXMLElement *e) { 
    if ([[e child:@"author"].text isEqualToString:@"foo1"]) { 
     NSLog(@"Blog Text is %@.", e.text); 
    } else { 
     NSLog(@"Comment Text is %@.", e.text); 
    } 
}]; 

ACTUALIZACIÓN: ¡RaptureXML ahora es compatible con XPath!

+4

RaptureXML es travieso !! – user7865437

+1

¡Oh hombre, eso es increíble! ¡Gracias por compartir esto! –

+0

Tengo un nuevo proyecto para trabajar en este año. Esto se ve increíble. – endy

0

Como usted tiene requisito para XML tamaño mediano

TinyXML podría ser una buena opción para documentos de tamaño medio, si ya tiene experiencia con la API y se sienten cómodos con C como él con bastante facilidad puertos más al iPhone.

For More information you can go through this link

0

recomendaría un analizador XML ligero llamado "CDXMLKit." Puede encontrarlo en http://www.cdframeworks.com/product/cdxmlkit y es realmente fácil de usar.

Aquí hay un código de muestra del analizador:

CDXMLDocument * document = [[CDXMLDocument alloc] initWithXMLURL:@"--url--"]; 
CDXMLNode * blog = [[document childrenWithName:@"blog"] firstObject]; 
NSString * blogAuthor = [[[blog childrenWithName:@"author"] firstObject] innerContent]; 
CDXMLNode * comments = [[blog childrenWithName:@"comments"] firstObject]; 
for(CDXMLNode * commentNode in comments.children) { 
    NSString * commentAuthor = [[[commentNode childrenWithName:@"author"] firstObject] innerContent]; 
    NSString * commentText = [[[commentNode childrenWithName:@"text"] firstObject] innerContent]; 
    NSLog(@"%@: %@", commentAuthor, commentText); 
} 
1

hice este nuevo analizador XML sencillo y ligero para iOS en Swift - AEXML

Se puede utilizar para leer datos XML como esto:

let someValue = xmlDocument["element"]["child"]["anotherChild"].value 

o puede utilizarlo para construir cadena XML como esto:

let document = AEXMLDocument() 
let element = document.addChild("element") 
element.addChild("child") 
document.xmlString // returns XML string of the entire document structure 

Espero que sea útil para alguien.

Cuestiones relacionadas