Was ist ein XML-Parser? Mit Expat
-
03-07-2019 - |
Frage
Dies mag wie eine einfache Frage zu sein scheint.
Aber ich habe mich für einen XML-Parser in einen meiner Anwendungen zu verwenden, die unter Linux ausgeführt wird.
Ich bin mit Expat und habe meine XML-Datei analysiert, indem ein Lese in. Allerdings ist der Ausgang gleich dem Eingang.
Das ist meine Datei, in der ich zu lesen:
<?xml version="1.0" encoding="utf-8"?>
<books>
<book>
<id>1</id>
<name>Hello, world!</name>
</book>
</books>
Doch nachdem ich diese bestanden haben, bekomme ich genau das gleiche wie der Ausgang. Es macht mich frage mich, was der Parser für ist?
Nur noch eine Sache. Ich bin mit Expat. Was ziemlich schwierig scheint zu verwenden. Mein Code ist unten: Das in einer Datei liest. Aber meine Anwendung muss einen Puffer analysieren, die von einem Socket empfangen werden, und nicht aus einer Datei. Gibt es irgendwelche Proben dafür, dass jemand?
int parse_xml(char *buff)
{
FILE *fp;
fp = fopen("mybook.xml", "r");
if(fp == NULL)
{
printf("Failed to open file\n");
return 1;
}
/* Obtain the file size. */
fseek (fp, 0, SEEK_END);
size_t file_size = ftell(fp);
rewind(fp);
XML_Parser parser = XML_ParserCreate(NULL);
int done;
memset(buff, 0, sizeof(buff));
do
{
size_t len = fread(buff, 1, file_size, fp);
done = len < sizeof(buff);
if(XML_Parse(parser, buff, len, done) == XML_STATUS_ERROR)
{
printf("%s at line %d\n", XML_ErrorString(XML_GetErrorCode(parser)),
XML_GetCurrentLineNumber(parser));
return 1;
}
}
while(!done);
fclose(fp);
XML_ParserFree(parser);
return 0;
}
Lösung
Es dauerte eine Weile, um meinen Kopf um XML zu wickeln Parsen (obwohl ich es in Perl zu tun, nicht C). Grundsätzlich registrieren Sie Callback-Funktionen. Der Parser wird Ihren Rückruf für jeden Knoten und übergibt in einer Datenstruktur ping alle Arten von saftigen Bits (wie Klartext, alle Attribute, die Kinder-Knoten, etc.) enthält. Sie haben eine Art von Statusinformationen zu erhalten -. Wie ein Hash-Baum Sie Sachen in, oder einen String-Stecker, der alle Eingeweide enthält, aber keiner der XML
Bitte beachten Sie, dass XML nicht linear ist und es nicht viel Sinn machen, um es wie ein langer großes Stück von Text zu analysieren. Stattdessen analysieren Sie es wie ein Baum. Viel Glück.
Andere Tipps
Expat ist ein selbst-driven-Parser. Sie haben den Code zu schreiben, mit Tags, Attribute usw. zu behandeln und dann den Code mit dem Parser registrieren. Es gibt einen Artikel hier die beschreibt, wie zu tun dies.
von einem Socket In Bezug auf das Lesen, je nach Plattform Sie in der Lage sein kann, den Sockel wie wie ein Datei-Handle zu behandeln. Andernfalls müssen Sie Ihre eigene Lesung aus der Steckdose tun und dann die Daten explizit auf Expat geben. Es ist eine API, dies zu tun. Ich würde jedoch versuchen, um es zunächst mit gewöhnlichen Dateien arbeiten.
Statt Expat, möchten Sie vielleicht einen Blick auf libxml2 haben, die wahrscheinlich schon in Ihrer Distribution enthalten ist. Es ist viel mächtiger als Expat, und gibt Ihnen alle möglichen Leckereien: DOM (Baum-Modus), SAX (Streaming-Modus), XPath (unentbehrliche etwas Komplex mit XML IMHO zu tun) und vieles mehr. Es ist nicht so leicht wie expat, aber es ist viel einfacher zu bedienen.
Nun, Sie die komplizierteste XML-Parser wählten (event-driven-Parser sind schwieriger zu handhaben). Warum Expat und nicht Libxml ?