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;
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top