Parser un fichier XML sans connaitre aucun tag ni attribut à  l'avance

Bonsoir,

Je suis à  la recherche d'un code permettant de parser un fichier XML sans connaitre au préalable aucun tag ni même attribut, cà d qui parse n'importe quel XML qu'on lui donne. Quelqu'un saurait ou je peux trouver ça? image/rolleyes.gif' class='bbc_emoticon' alt='::)' />
Mots clés:

Réponses

  • Bonsoir,



    Simplement avec NSXMLParser inclus dans iOS (documentation)

    Tu télécharges ton XML et quand c'est fini tu créés une instance de NSXMLParser que tu init avec ton ton xml (qui sera sous forme de NSData. Tu set le delegate et tu start.



    Je te laisse le soin de regarder les méthodes du délégué.

    Ca fait des années que j'ai pas utilisé XML donc j'espère ne pas trop avoir dit de conneries.



    Sinon tu peux te présenter ici image/wink.png' class='bbc_emoticon' alt=';)' />
  • CéroceCéroce Membre, Modérateur
    À la vérité, NSXMLParser n'est pas une grande réussite: c'est compliqué à  mettre en oe“uvre quand on veut récupérer un arbre d'objets. Quel parseur alternatif utilisez-vous ?
  • Bah perso je passe par du JSON.

    J'ai vu TBXML ou SMXMLDocument qui est plus light
  • TouchXML qui est un wrapper de libxml2.

    https://github.com/TouchCode/TouchXML



    Pratique car il gère XPath.



  • 'Ceetix' a écrit:


    Bah perso je passe par du JSON.

    J'ai vu TBXML ou SMXMLDocument qui est plus light


    J'ai testé le SMXMLDocument, mais il ne trie pas tt seul les champs, il faut qu'on lui signale lesquels on attend image/huh.gif' class='bbc_emoticon' alt='???' />

    En fait, comme je sais pas encore coder en Objective C, on m'a demandé de trouver déjà  tout fait un parser pr iPhone qui trie tte l'arborescence en tenant compte d'éventuels attributs qui peuvent être n'importe ou, pour pouvoir exploiter ensuite ces résultats, ça fait 4 jours que je suis dessus et je galère image/sad.png' class='bbc_emoticon' alt=':(' />
  • CeetixCeetix Membre
    avril 2012 modifié #8
    Ah ouai non mais commencer par utiliser une lib etc .. sans savoir coder en Obj-C ca va être tendu ! (Genre tu as compris mon premier message d'explication ?)

    Enfin normalement avec NSXMLParser tu devrais pouvoir t'en sortir.
  • 'Ceetix' a écrit:


    Ah ouai non mais commencer par utiliser une lib etc .. sans savoir coder en Obj-C ca va être tendu ! (Genre tu as compris mon premier message d'explication ?)

    Enfin normalement avec NSXMLParser tu devrais pouvoir t'en sortir.


    Oui oui, j'ai potassé des cours d'objective C, et j'avais fais un petit peu de Java l'été dernier, du coup ça me parle, mais en parsing c'est tt à  fait nouveau! C'est pour ça qu'on me demande de trouver le code déjà  tout fait! Mais je crois que je vois pas trop comment stocker les données lues par le parser, et puis si on sait si il y a des attributs ça doit compliquer les choses! image/huh.gif' class='bbc_emoticon' alt='???' />
  • 'Solveig' a écrit:


    J'ai testé le SMXMLDocument, mais il ne trie pas tt seul les champs, il faut qu'on lui signale lesquels on attend image/huh.gif' class='bbc_emoticon' alt='???' />

    En fait, comme je sais pas encore coder en Objective C, on m'a demandé de trouver déjà  tout fait un parser pr iPhone qui trie tte l'arborescence en tenant compte d'éventuels attributs qui peuvent être n'importe ou, pour pouvoir exploiter ensuite ces résultats, ça fait 4 jours que je suis dessus et je galère image/sad.png' class='bbc_emoticon' alt=':(' />




    Très rock'n roll comme démarche :-)
  • Ah le Java ... *pars se tirer une balle*

    Bref, il me semble quand tes methodes delegate tu peux connaitre la current node. Tu peux partir sur un dictionnaire.
  • AliGatorAliGator Membre, Modérateur
    avril 2012 modifié #12
    • NSXMLParser est un parseur SAX (donc événementiel). Il t'informe au fur et à  mesure qu'il parse le XML des tags qu'il rencontre (et de leurs attributs). A toi d'en faire ce que tu veux à  ce moment là  (construire des objets métier en conséquence, exécuter des actions, ça dépend de ton besoin)
    • iOS n'intègre de base que NSXMLParser. D'ailleurs ce n'est pas le parseur SAX le plus efficace en terme de performances. Il fait très bien son boulot, mais si tu as une appli qui se base énormément sur du XML, il peut être préférable d'utiliser une autre lib de parsing, SAX ou DOM selon tes besoins
    • Si tu veux un parseur qui te construit automatiquement l'arbre DOM de ton XML, c'est à  dire qu'une fois qu'il a parsé ton XML il te retourne un arbre des objets qu'il a construit et qui reprend l'arborescence du XML, il te faut un parseur DOM. Il existe plusieurs libs pour iOS qui proposent des parseurs DOM, à  toi de choisir lequel tu veux (il n'en existe pas d'intégré à  iOS comme indiqué plus haut, seul le parseur SAX étant dispo intégré dans le SDK)


    Les parseurs DOM pour iOS les plus connus sont TBXML (que perso je trouve mal foutu, enfin je trouve que l'API n'est pas pratique à  utiliser), KissXML (qui reprend exactement la même API que NSXMLDocument pour MacOSX, donc ça permet de retrouver ses petits, et t'as toute la doc Apple pour NSXMLDocument sous OSX déjà  de dispo en plus) que je préfère.



    Exemple :
    // Exemple de XML :<br />
    // &lt;library&gt;<br />
    //   &lt;book id=&quot;27&quot; title=&quot;Dome&quot; author=&quot;Stephen King&quot; /&gt;<br />
    <br />
    //   &lt;book author=&quot;Le Trône de Fer&quot; id=&quot;5&quot; title=&quot;Georges R.R. Martin&quot; tome=&quot;1&quot;&gt;<br />
    //	  &lt;description&gt;Blablabla&lt;/description&gt;<br />
    //   &lt;/book&gt;<br />
    // &lt;/library&gt;<br />
    <br />
      DDXMLDocument* xml = [[DDXMLDocument alloc] initWithData:xmlData options:0 error:nil];			<br />
      NSArray* bookNodes = [xml.rootElement elementsForName:@&quot;book&quot;];<br />
      for(DDXMLElement* bookNode in bookNodes)<br />
      {<br />
    	 NSString* bookTitle = [[bookNode attributeForName:@&quot;title&quot;] stringValue];<br />
    	 NSString* bookAuthor = [[bookNode attributeForName:@&quot;author&quot;] stringValue];<br />
    	 ...<br />
      }
    
  • AlakAlak Membre
    avril 2012 modifié #13
    Personnellement, j'utilise TBXML et à  l'opposé d'Ali, je la trouve pas mal leur API, sinon si ça vous intéresse :

    http://www.raywender...-iphone-project (un comparatif des API pour parser du XML sur iOS)
  • CeetixCeetix Membre
    avril 2012 modifié #14
    Bon reste sur du NSXMLParser.



    Dans ton . h
    [color=#04afc8][color=#c0399a]@interface MyClass[/color][color=#ffffff] : [/color]NSObject[color=#ffffff] &lt;[/color]NSXMLParserDelegate[color=#ffffff]&gt;[/color][/color]<br />
    [color=#04afc8]@property[color=#ffffff] ([/color]nonatomic[color=#ffffff], [/color]retain[color=#ffffff]) [/color][color=#04afc8]NSXMLParser[/color][color=#ffffff] *parser;[/color][/color]<br />
    @end
    




    Dans ton . m
    [color=#e2454c][color=#d08f5e]#import [/color]&quot;MyClass.h&quot;[/color]<br />
    [color=#c0399a]@implementation[color=#ffffff] MyClass[/color][/color]<br />
    @synthesize[color=#ffffff] [/color]parser = [color=#95c76e]_parser[/color];<br />
    - (void)methodeALaCon<br />
    {<br />
    /* Dans une méthode à  la con ou dans ton viewDidLoad */<br />
    /* ... */<br />
    [color=#ffffff]	[/color]NSData[color=#ffffff] *XMLData = [[/color]NSData[color=#ffffff] [/color]dataWithContentsOfFile[color=#ffffff]:[[[/color]NSBundle[color=#ffffff] [/color]mainBundle[color=#ffffff]] [/color]pathForResource[color=#ffffff]:[/color][color=#e2454c]@&quot;TonFichier&quot;[/color][color=#ffffff] [/color]ofType[color=#ffffff]:[/color][color=#e2454c]@&quot;xml&quot;[/color][color=#ffffff]]];[/color]<br />
    [color=#04afc8][color=#ffffff]	[/color][color=#95c76e]_parser[/color][color=#ffffff] = [[[/color]NSXMLParser[color=#ffffff] [/color]alloc[color=#ffffff]] [/color]initWithData[color=#ffffff]:XMLData]; [/color][/color]<br />
    [color=#04afc8][color=#ffffff]	[[/color][color=#95c76e]_parser[/color][color=#ffffff] [/color]setDelegate[color=#ffffff]:[/color][color=#c0399a]self[/color][color=#ffffff]];[/color][/color]<br />
    [color=#ffffff]	[[color=#95c76e]_parser[/color] [color=#04afc8]parse[/color]];[/color]<br />
    }<br />
    <br />
    [color=#ffffff]- ([color=#c0399a]void[/color])parser:([color=#04afc8]NSXMLParser[/color] *)parser didStartElement:([color=#04afc8]NSString[/color] *)elementName namespaceURI:([color=#04afc8]NSString[/color] *)namespaceURI qualifiedName:([color=#04afc8]NSString[/color] *)qName attributes:([color=#04afc8]NSDictionary[/color] *)attributeDict[/color]<br />
    [color=#ffffff]{[/color]<br />
    [color=#ffffff]	[color=#04afc8]NSLog[/color]([color=#e2454c]@&quot;%@&quot;[/color],elementName);[/color]<br />
    [color=#ffffff]}[/color]
    




    La console va t'afficher les différentes nodes de ton fichier XML. Tu peux donc les stocker.
  • 'AliGator' a écrit:
    • NSXMLParser est un parseur SAX (donc événementiel). Il t'informe au fur et à  mesure qu'il parse le XML des tags qu'il rencontre (et de leurs attributs). A toi d'en faire ce que tu veux à  ce moment là  (construire des objets métier en conséquence, exécuter des actions, ça dépend de ton besoin)
    • iOS n'intègre de base que NSXMLParser. D'ailleurs ce n'est pas le parseur SAX le plus efficace en terme de performances. Il fait très bien son boulot, mais si tu as une appli qui se base énormément sur du XML, il peut être préférable d'utiliser une autre lib de parsing, SAX ou DOM selon tes besoins
    • Si tu veux un parseur qui te construit automatiquement l'arbre DOM de ton XML, c'est à  dire qu'une fois qu'il a parsé ton XML il te retourne un arbre des objets qu'il a construit et qui reprend l'arborescence du XML, il te faut un parseur DOM. Il existe plusieurs libs pour iOS qui proposent des parseurs DOM, à  toi de choisir lequel tu veux (il n'en existe pas d'intégré à  iOS comme indiqué plus haut, seul le parseur SAX étant dispo intégré dans le SDK)


    Les parseurs DOM pour iOS les plus connus sont TBXML (que perso je trouve mal foutu, enfin je trouve que l'API n'est pas pratique à  utiliser), KissXML (qui reprend exactement la même API que NSXMLDocument pour MacOSX, donc ça permet de retrouver ses petits, et t'as toute la doc Apple pour NSXMLDocument sous OSX déjà  de dispo en plus) que je préfère.


    Houlala tu t'y connais image/huh.gif' class='bbc_emoticon' alt='???' />

    Mais si je veux que le parser me renvoie un résultat sous forme de tableau, je dois choisir quoi? image/smile.png' class='bbc_emoticon' alt=':)' />
  • 'Ceetix' a écrit:


    Bon reste sur du NSXMLParser.


    Je teste ça image/xd-laugh.gif' class='bbc_emoticon' alt='xd' />
  • J'ai été chargée d'une nouvelle mission... Je crois qu'on est tous soulagés! image/rolleyes.gif' class='bbc_emoticon' alt='::)' />

    Merci de vos conseils image/wub.png' class='bbc_emoticon' alt=' <3 ' />
  • Juste pour finir, j'utilise aussi TBXML, je trouve qu'il est super simple à  utiliser et gère nativement les éléments parents et enfants. Pour les tâches plus complexe, faut effectivement que je trouve une autre lib car je trouve qu'on attends assez vite les limites de TBXML quand on veut faire quelque chose d'un peu avancé, soit ça ne le fait pas, soit comme le dit Ali ça devient mal foutu.



    Par contre, je ne supporte pas le parser natif d'iOS ...
Connectez-vous ou Inscrivez-vous pour répondre.