Erreur libxml2 avec les espaces de noms et xpath

Je colle un code ici qui est compilé sans avertissement à l’aide de gcc fichier.c -lxml2, en supposant que libxml2 est installé sur votre système.

#include  #include  #include  #include  #include  xmlDocPtr getdoc (char *docname) { xmlDocPtr doc; doc = xmlParseFile(docname); if (doc == NULL ) { fprintf(stderr,"Document not parsed successfully. \n"); return NULL; } return doc; } xmlXPathObjectPtr getnodeset (xmlDocPtr doc, xmlChar *xpath){ xmlXPathContextPtr context; xmlXPathObjectPtr result; context = xmlXPathNewContext(doc); if (context == NULL) { printf("Error in xmlXPathNewContext\n"); return NULL; } if(xmlXPathRegisterNs(context, BAD_CAST "new", BAD_CAST "http://www.example.com/new") != 0) { fprintf(stderr,"Error: unable to register NS with prefix"); return NULL; } result = xmlXPathEvalExpression(xpath, context); xmlXPathFreeContext(context); if (result == NULL) { printf("Error in xmlXPathEvalExpression\n"); return NULL; } if(xmlXPathNodeSetIsEmpty(result->nodesetval)){ xmlXPathFreeObject(result); printf("No result\n"); return NULL; } return result; } int main(int argc, char **argv) { char *docname; xmlDocPtr doc; xmlChar *xpath = (xmlChar*) "/new:book/section1"; xmlNodeSetPtr nodeset; xmlXPathObjectPtr result; int i; xmlChar *keyword; if (argc nodesetval; for (i=0; i nodeNr; i++) { keyword = xmlNodeListGetSsortingng(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1); printf("keyword: %s\n", keyword); xmlFree(keyword); } xmlXPathFreeObject (result); } xmlFreeDoc(doc); xmlCleanupParser(); return (1); } 

Mon problème est que je veux parsingr le XML suivant

   Sec_1 Sec_2  

L’élément book définit un espace de nom à l’intérieur de cet élément. Je veux imprimer la valeur dans le xpath / book / section1 et il renvoie NULL. Lorsque j’essaie de renvoyer l’élément sous un espace de noms, des erreurs surviennent également, par exemple, / new: book / section1

Je suppose que mon code échoue parce que je n’utilise pas correctement les préfixes d’espace de nom. Je manque de temps. S’il te plait peux-tu aider?

    Comme je l’ai découvert par la suite, ce n’est pas vraiment un échec de libXml, c’est un problème car libXml respecte correctement les spécifications XML / XPATH.

    Les solutions proposées par R Bourdeau sont correctes, toutefois, si vous avez le contrôle du document XML que vous parsingz.

    Le contexte de la requête XPATH est indépendant des qualificateurs d’espace de nom du document xml. L’espace de noms par défaut force toutes les balises enfants dans un espace de noms; ils ne requièrent pas de qualification dans le document mais doivent être qualifiés dans la requête xpath. Heureusement, vous avez enregistré l’espace de noms en tant que new avec libXml. La solution de cateof devrait donc fonctionner.

     xmlXPathRegisterNs(context, BAD_CAST "new", BAD_CAST "http://www.example.com/new" xmlChar *xpath = (xmlChar*) "/new:book/new:section1"; 

    J’inline le XML ici pour la visibilité:

       Sec_1 Sec_2  

    C’est un échec gênant de la bibliothèque libXml. Comme indiqué par cateof, le problème est la déclaration d’espace de nom par défaut:

    xmlns = “http://www.example.com/new”

    Deux choix:
    (1) supprimez cette déclaration dans votre balise book ou (2) donnez-lui un nom et utilisez-le dans vos balises.

    par exemple

    xmlns: new = “http://www.example.com/new”

    Ensuite, vos tags ressemblent tous à:

    nouveau: livre nouveau: section1

    etc.

    c’est un problème avec l’espace de noms par défaut. Pour faire correspondre un chemin dont vous avez besoin / new: tag / new: tag et ainsi de suite