Zitat von
undefined
Die Meldung besagt das ein nicht erlaubtes Zeichen im Dokument enthalten ist.
Das "error" davor zeigt aber auch an, dass vorher schon etwas schief gelaufen ist.
Und das ist mit & auch der fall. Du kannst nicht einfach einen XMLString laden und weiter geben, dabei erwarten das libXML für dich die Entity Referenzen ohne DTD auflöst und dass mit dem falschen Zeichensatz. So etwas kann nicht gut gehen
Ich glaube wir reden aneinander vorbei.
Nehmen wir mal die folgende URL: http://musicbrainz.org/ws/1/track/?t...73%62%61%6e%64.
Da kommt ja im Dokument selber kein unerlaubtes Zeichen vor, oder?
Und dann folgenden Code:
Code:
#include <libxml/parser.h>
#include <libxml/xpath.h>
#include <unistd.h>
xmlXPathObjectPtr
getnodeset (xmlDocPtr doc, xmlChar *xpath){
xmlXPathContextPtr context;
xmlXPathObjectPtr result;
context = xmlXPathNewContext(doc);
if (context == NULL) {
printf("Error in xmlXPathNewContext\n");
return NULL;
}
xmlXPathRegisterNs(context,"mmd","http://musicbrainz.org/ns/mmd-1.0#");
xmlXPathRegisterNs(context,"ext","http://musicbrainz.org/ns/ext-1.0#");
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*) "//mmd:metadata/mmd:track-list/mmd:track[@ext:score='100']/mmd:artist/mmd:name | "
"//mmd:metadata/mmd:track-list/mmd:track[@ext:score='100']/mmd:release-list/mmd:release/mmd:title";
xmlNodeSetPtr nodeset;
xmlXPathObjectPtr result;
int i;
xmlChar *keyword;
docname = "http://musicbrainz.org/ws/1/track/?type=xml&artist=%54%68%65%20%46%69%65%72%79%20%46%75%72%6e%61%63%65%73&limit=1&title=%41%75%74%6f%6d%61%74%69%63%20%48%75%73%62%61%6e%64";
doc = xmlParseFile(docname);
if (doc==NULL)
{
printf("Fehler!\n");
return 1;
}
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("name: %s, keyword: %s\n", nodeset->nodeTab[i]->name, keyword);
xmlFree(keyword);
}
xmlXPathFreeObject (result);
}
xmlFreeDoc(doc);
xmlCleanupParser();
return 0;
}
.
Das Kompiliere ich und führe es aus:
Code:
florian@leuchtturm0:~/code/pthreads/cover$ gcc -o xpath xpath.c -lxml2 -I/usr/include/libxml2
florian@leuchtturm0:~/code/pthreads/cover$ ./xpath
name: name, keyword: The Fiery Furnaces
name: title, keyword: Widow City
florian@leuchtturm0:~/code/pthreads/cover$
Also läuft da alles wunderbar.
Mache ich das in XMMS (also einfach
Code:
docname = "http://musicbrainz.org/ws/1/track/?type=xml&artist=%54%68%65%20%46%69%65%72%79%20%46%75%72%6e%61%63%65%73&limit=1&title=%41%75%74%6f%6d%61%74%69%63%20%48%75%73%62%61%6e%64";
doc = xmlParseFile(docname);
), dann funktioniert es nicht mehr. Ich glaube eher nicht, dass das etwas mit dem Zeichensatz zu tun hat.
Die richtige Arbeitsweise wäre.
- Dokument in den Parser laden.
Aber hier ist ja schon Schluss im Zusammenhang mit XMMS!
- Zeichensatz und nicht erlaubte Zeichen Konvertieren.
- Neu aufbauen
- Weiter geben
Alles andere ist Lotterie spielen
Und was jetzt
Lesezeichen