Retourner aux forums || Retourner au forum Programmation.web

Programmation.web : XPath : comment formuler cette requête ?

Posté par Pinaraf (Jabber id, ) le 22 août 2004
0
Bonsoir

Je cherche à réaliser une requête XPath qui renvoie
"hdparm
fpack2"
à partir du texte "fnux-base" (et "fpack2" à partir de "libxml2") et du fichier xml suivant :
<root>
<package name="hdparm">
<depends>fnux-base
fnux-base
</depends>
</package>
<package name="fpack2">
<depends>fnux-base
fnux-base
fnux-base
fnux-base
libxml2
fnux-base
</depends>
</package>
</root>

Or je n'y arrive pas :
/root[contains(./package/depends/text(),"fnux-base")]
Ceci renvoie tous les noeuds, mais si on met libxml2, ne renvoie plus rien !

Merci d'avance !

> Lire le message (5 commentaires, moyenne: 1,6).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

Non testé mais

Posté par _alex () le 22/08/2004 à 21:59. (lien). Évalué à 3.

Si en français ta requête est : on prends le nom de tous les paquets dont depends contient aPackageName; alors je dirais :

//package[contains(./depends/text(), 'aPackageName')]/@name

Cette requête renvoit un NodeSet, donc après il faut concaténer chaque Node du NodeSet pour avoir une seule chaîne de caractères. Cela doit être possible directement avec string :

string(//package[contains(./depends/text(), 'aPackageName')]/@name)

cf http://www.w3.org/TR/xpath(...) (à la fin pour toute les fonctions)

  • [^]Re: Non testé mais

    Posté par Pinaraf (Jabber id, ) le 22/08/2004 à 22:25. (lien). Évalué à 1.

    C'est ce que j'ai essayé (entre autres) mais ça ne marche pas :(
    Ça me renvoie uniquement hdparm (dans le cas de fnux-base) et fpack2 (pour libxml2)

    • [^]testé et

      Posté par _alex () le 23/08/2004 à 07:50. (lien). Évalué à 2.

      c'est moi ça marche.
      J'ai pris cet exemple de la doc : http://www.xmlsoft.org/examples/index.html#xpath1.c(...)

      Modifier un peu le code de print_xpath_nodes(xmlNodeSetPtr nodes, FILE* output) pour afficher le contenu des attributs.

      Et avec ton fichier :
      [alex@zzz ~/xpath]$ ./xpath1 test.xml "//package[contains(./depends/text(),'libxml2')]/@name"
      Result (2 nodes):
      = attribute "name"
      value="fpack2"

      [alex@zzz ~/xpath]$ ./xpath1 test.xml "//package[contains(./depends/text(),'base')]/@name"
      Result (3 nodes):
      = attribute "name"
      value="hdparm"
      = attribute "name"
      value="fpack2"

      D'ailleurs attention aux effet parasite : si tu cherche le package "base" alors qu'un package s'appelle "xmlbase" -> tu match alors que tu ne devrais pas.

      Code en peluche :


      } else if(nodes->nodeTab[i]->type == XML_ELEMENT_NODE) {
      // tout pareil
      } else if(nodes->nodeTab[i]->type == XML_ATTRIBUTE_NODE) {
      cur = nodes->nodeTab[i];
      xmlNodePtr parent= cur->parent;
      fprintf(output, "= attribute \"%s\"\n", cur->name);
      fprintf(output, " value=\"%s\"\n", xmlGetProp(parent, "name"));
      } else {
      // tout pareil
      }

      • [^]Re: testé et

        Posté par Pinaraf (Jabber id, ) le 23/08/2004 à 15:29. (lien). Évalué à 1.

        Boarf
        Zut chez moi le même genre de code ne marche pas !

Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.web