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 2004Je 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).
Non testé mais
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 fabrizio duhem (page perso, ) le 23/08/2004 à 11:53. (lien). Évalué à 1.fprintf(output, " value=\"%s\"\n", xmlGetProp(parent, "name"));
Memory leak
the attribute value or NULL if not found. It's up to the caller to free the memory with xmlFree().
http://xmlsoft.org/html/libxml-tree.html#xmlGetProp(...)
-
[^]Re: testé et
-
-
Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.web



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.