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

Posté par  .
Étiquettes : aucune
0
22
août
2004
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 !
  • # Non testé mais

    Posté par  . É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  . É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  . É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
        }

Suivre le flux des commentaires

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