2010-11-15 5 views
40

Il existe un million de parseurs XML différents pour l'iPhone. J'ai un fichier XML de taille moyenne qui contient beaucoup de balises en double (à différents points dans la hiérarchie). Je pensais à TBXML mais j'étais préoccupé par son manque de support XPath. Par exemple, disons que mon fichier XML ressemblait à ceci.Choisir le bon analyseur XML IOS

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

Fondamentalement, mes exigences sont que je dois être en mesure d'extraire ce cdata. Et savoir si c'est l'auteur du blog un auteur de commentaire.

Répondre

52

meilleure comparaison que je l'ai vu sur le sujet:

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

La différence entre les plus lents dans son cas et plus rapide parseurs a été un facteur de 2. En fonction de vos besoins de fonctionnalités, il y a certainement des parseurs Cela peut réduire votre temps d'analyse de moitié.

+1

Certaines des choses dans l'article deviennent obsolètes, mais dans l'ensemble encore très utile (juste poster pour que les gens puissent voir cette réponse est toujours valide à la fin de Juillet) – Cameron

+1

Note. KissXML déplacé à Github et toujours en cours de mise à jour. https://github.com/robbiehanson/KissXML – Eonil

+1

Dans le cas où quelqu'un voudrait réexécuter les tests avec des parseurs mis à jour: https://github.com/jansanz/iOSXMLPerformance (J'en ai également inclus 2 de plus qui n'étaient pas à l'origine dans le test). –

31

Découvrez RaptureXML. Ce n'est pas un comportement XPath officiel, mais c'est assez proche. Votre requête serait:

[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); 
    } 
}]; 

MISE À JOUR: RaptureXML prend désormais en charge XPath!

+4

RaptureXML est méchant !! – user7865437

+1

Oh mec, c'est génial! Merci de partager cela! –

+0

J'ai un nouveau projet à travailler cette année. Cela a l'air incroyable. – endy

0

Comme vous avez besoin de XML de taille moyenne

TinyXML pourrait être un bon choix pour les documents de taille moyenne si vous avez déjà une expérience avec l'API et sont à l'aise avec C comme il les ports assez facilement sur l'iPhone.

For More information you can go through this link

0

Je recommande un analyseur XML léger appelé "CDXMLKit." Vous pouvez le trouver sur http://www.cdframeworks.com/product/cdxmlkit et c'est vraiment facile à utiliser.

Voici quelques exemples de code de l'analyseur:

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

J'ai fait ce nouvel analyseur XML simple et léger pour iOS à Swift - AEXML

Vous pouvez l'utiliser pour lire des données XML comme ceci:

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

ou vous pouvez l'utiliser pour construire comme chaîne XML ceci:

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

J'espère que ce sera utile pour quelqu'un.