libxml2 Fehler mit namespaces und xpath
Ich bin einfügen von einigen hier den code, der kompiliert ohne Warnung mit gcc Datei.c -lxml2, unter der Annahme, dass libxml2 installiert ist Ihr system.
#include <libxml/parser.h>
#include <libxml/xpath.h>
#include <assert.h>
#include <libxml/tree.h>
#include <libxml/xpathInternals.h>
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 <= 1) {
printf("Usage: %s docname\n", argv[0]);
return(0);
}
docname = argv[1];
doc = getdoc(docname);
result = getnodeset (doc, xpath);
if (result) {
nodeset = result->nodesetval;
for (i=0; i < nodeset->nodeNr; i++) {
keyword = xmlNodeListGetString(doc, nodeset->nodeTab[i]->xmlChildrenNode, 1);
printf("keyword: %s\n", keyword);
xmlFree(keyword);
}
xmlXPathFreeObject (result);
}
xmlFreeDoc(doc);
xmlCleanupParser();
return (1);
}
Mein problem ist, dass ich möchte, um die folgenden xml -
<?xml version="1.0" encoding="UTF-8"?>
<book xmlns="http://www.example.com/new">
<section1>Sec_1</section1>
<section2>Sec_2</section2>
</book>
das Buch-element definiert einen namespace in element. Ich will drucken Sie den Wert des xpath /Buch/Abs.1 und es wird NULL zurückgegeben. Wenn ich versuche, das element zurückgegeben werden unter einem namespace bekomme ich auch Fehler, ie /neu:Buch/Abs.1
Ich gehe davon aus, dass mein code nicht, denn ich bin nicht richtig mit der namespace-Präfixe. I run out of time. Könnten Sie bitte helfen?
InformationsquelleAutor cateof | 2010-06-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Stellt sich heraus, als ich herausfand, von hier,
es ist nicht wirklich ein Fehler von libXml, es ist ein problem, weil libXml richtig folgt der XML - /XPATH-Spezifikationen.
Die vorgeschlagenen Lösungen von R Bourdeau sind richtig, jedoch, wenn Sie die Kontrolle über das xml-Dokument Parsen.
Rahmen für die XPATH-Abfrage unabhängige der namespace-Qualifier in das xml-Dokument. Der Standard-namespace verwendet wird, müssen alle untergeordneten tags, die in einem namespace; Sie erfordern nicht die Qualifikation in das Dokument aber muss qualifiziert werden, in der xpath-Abfrage. Zum Glück, Sie registriert den namespace als
new
mit libXml, so cateof die Lösung sollte funktionieren.Ich bin inlining der xml hier für die Sichtbarkeit:
InformationsquelleAutor dmaestro12
Dies ist ein ärgerlicher Fehler der libXml Bibliothek. Wie bereits von cateof, das problem ist der Standard-namespace-Deklaration:
xmlns="http://www.example.com/new"
Zwei Möglichkeiten:
(1) loszuwerden, die Erklärung in deinem Buch-tag
oder
(2) geben Sie einen Namen ein, und verwenden Sie diese Namen in Ihren tags.
z.B.
xmlns:new="http://www.example.com/new"
Dann deine tags sehen alle aus, wie:
neu:Buch
neu:Abs.1
und so weiter.
libxml
dass einige namespace default/implizit für alle Elemente in einem Dokument zu vermeiden, Sie zu wiederholen immer und immer wieder in XPath-Abfragen?InformationsquelleAutor Robert H. Bourdeau
ist es ein Problem mit der Standard-namespace. Um einen Pfad, den Sie brauchen /neu:tag/neue:tag
und so weiter
InformationsquelleAutor cateof