Un problème de XPath

ChachaChacha Membre
janvier 2006 modifié dans API AppKit #1
Salut,

J'ai un document XML que voici (c'est du SVG).
J'aimerais récupérer la chaà®ne de caractères de l'attribut "dc:description" (ici je veux donc récupérer toto).
Pour ça, j'utilise un XMLDocument et un "nodesWithXPath:", mais je n'arrive pas à  construire un XPath qui me renvoie mon résultat. Quelqu'un aurait la formule magique ?

+
Chacha


<br />&lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;<br />&lt;!DOCTYPE svg PUBLIC &quot;-//W3C//DTD SVG 1.1//EN&quot; &quot;http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd&quot;&gt;<br />&lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; xmlns:xlink=&quot;http://www.w3.org/1999/xlink&quot; viewBox=&quot;0 0 300 300&quot;&gt;<br />&lt;metadata&gt;<br />	&lt;rdf:RDF<br />&nbsp; &nbsp; &nbsp; &nbsp;  xmlns:rdf = &quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp;  xmlns:rdfs = &quot;http://www.w3.org/2000/01/rdf-schema#&quot;<br />&nbsp; &nbsp; &nbsp; &nbsp;  xmlns:dc = &quot;http://purl.org/dc/elements/1.1/&quot; &gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &lt;rdf:Description about=&quot;description&quot; dc:description=&quot;toto&quot; dc:format=&quot;image/svg+xml&quot;&gt;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  &lt;/rdf:Description&gt;<br />	&lt;/rdf:RDF&gt;<br />&lt;/metadata&gt;<br />&lt;/svg&gt;<br />

Réponses

  • Eddy58Eddy58 Membre
    16:06 modifié #2
    D'après la doc, il faut passer par la classe NSXMLElement pour gérer le SVG. :)
  • ChachaChacha Membre
    16:06 modifié #3
    dans 1138119103:

    D'après la doc, il faut passer par la classe NSXMLElement pour gérer le SVG. :)


    J'y arrive pas quand même. Je n'arrive pas à  récupérer les attributs !

    +
    Chacha
  • ChachaChacha Membre
    janvier 2006 modifié #4
    Je m'en suis sorti en bricolant un truc pas beau:
    <br />NSArray* nodes = [xmlDocument nodesForXPath:@&quot;.//svg/metadata/*[1]/*[1]&quot; error:&amp;error];<br />NSXMLElement* element = [nodes lastObject];<br />NSString* description = [[element attributeForName:@&quot;dc:description&quot;] stringValue];<br />
    

    Mais je n'arrive pas à  faire plus simple. Ce que j'avais essayé au début échoue lamentablement :
    <br />NSArray* nodes = [xmlDocument nodesForXPath:@&quot;.//svg/metadata/rdf:RDF/rdf:Description/@dc:description&quot; error:&amp;error];<br />
    


    +
    Chacha
  • ChachaChacha Membre
    16:06 modifié #5
    Et ben ça passionne pas les foules, mon problème !
  • Eddy58Eddy58 Membre
    16:06 modifié #6
    Ben apparemment ça fonctionne, non, avec le "truc pas beau" ? ;)
    Si ça ne doit pas fonctionner avec ce que tu as fait au début, c'est parce que c'est tout simplement pas la bonne manière je pense, mais bon je ne suis pas catégorique là -dessus car je n'ai jamais pratiqué avec les classes NSXML.
  • 16:06 modifié #7
    Mais j'aimerais bien t'aider moa (j'ai essayé d'y réfléchir pourtant). Mais j'connais pô le svg ou les classes NSXML (enfin à  part NSXMLParser, mais il est méga pô adapté à  ça).
  • ChachaChacha Membre
    16:06 modifié #8
    dans 1138214131:

    Mais j'aimerais bien t'aider moa

    Oh, mais je n'en doute pas (copain!)


    Mais j'connais pô le svg ou les classes NSXML

    C'est juste un problème de XML, je pense... Il se trouve qu'avec NSXMLmachin, je n'arrive pas facilement à  extraire l'attribut de mon choix. Comme je ne pense pas que NSXMLmachin soit pourri, je suppose que c'est moi qui me trompe en construisant ma requête XPath. Et il est possible que je me trompe parce que j'ai mal interprété l'arbre XML du svg.
    Pour moi, "dc:description" est un attribut de "rdf:Description" qiu est un élément de "rdf:RDF" qui est un élément de "metadata" qui est élément de "svg". Si c'était le cas, alors ma requête @".//svg/metadata/rdf:RDF/rdf:Description/@dc:description" marcherait.
    Or, elle ne marche pas.
    Donc je me suis trompé quelque part. Ce qui me trouble, ce sont ces "rdf:" et "dc:", je n'ai jamais vu ça, je me demande si ça fait partie du nom ou pas...

    +
    Chacha
  • ChachaChacha Membre
    16:06 modifié #9
    J'ai une piste !
    En fait en explorant la doc, j'ai vu que rdf: correspond à  un namespace (la vache, j'y connais rien aux namespace en XML).
    Le problème devient donc :
    Comment je construit ma requête pour gérer les namespace ?
    Bon, je cherche
    +
    Chacha
  • helgrindhelgrind Membre
    16:06 modifié #10
    Up  :)

    J'ai exactement le même problème.
  • AliGatorAliGator Membre, Modérateur
    16:06 modifié #12
    Le problème c'est que ce qui définit exactement un namespace, ce n'est pas son nom (local au XML) mais son URL.

    Ainsi si tu prends un XML du genre
    &lt;?xml version=&quot;1.0&quot;?&gt; <br />&lt;racine xmlns:ns1=&#39;http://plouf.org&#39;&gt;<br />&lt;ns1:toto&gt;tata&lt;/ns1:toto&gt;<br />&lt;/racine&gt;
    
    et un du genre :
    &lt;?xml version=&quot;1.0&quot;?&gt; <br />&lt;racine xmlns:paf=&#39;http://plouf.org&#39;&gt;<br />&lt;paf:toto&gt;tata&lt;/paf:toto&gt;<br />&lt;/racine&gt;
    
    seront strictement équivalents ! "paf" ou "ns1" ne sont que des noms locaux pour avoir une écriture plus courte des tags XML utilisant ce namespace, mais c'est l'URL "http://plouf.org"; qui les qualifie. On pourrait même écrire ce même XML :
    &lt;?xml version=&quot;1.0&quot;?&gt; <br />&lt;racine&gt;<br />&lt;toto xmlns=&#39;http://plouf.org&#39;&gt;tata&lt;/toto&gt;<br />&lt;/racine&gt;
    
    il aurait la même signification aussi.

    Il faut donc trouver un moyen de déclarer ton namespace avant de l'utiliser. Dans une feuille XSLT ça se fait dans l'arbre XML du XSLT, dans les XPath de Cocoa j'imagine qu'il faut vérifier où on peut les déclarer, sans doute vérifier dans le xmlDocument, un truc comme ça ?
  • helgrindhelgrind Membre
    16:06 modifié #13
    Oui, ça j'avais bien compris,
    le problème c'est justement comment déclarer ces namespaces avec NSXMLDocument.


Connectez-vous ou Inscrivez-vous pour répondre.