Vra

Dit kan lyk soos 'n eenvoudige vraag.

Maar ek is op soek na 'n XML parser om te gebruik in een van my aansoeke wat uitgevoer word op Linux.

Ek gebruik Expat en my XML-lêer het ontleed deur die lees van een in. die uitset is dieselfde as die insette.

Dit is my lêer ek lees in:

<?xml version="1.0" encoding="utf-8"?>
    <books>
         <book>
              <id>1</id>
              <name>Hello, world!</name>
         </book>
    </books>

Maar nadat ek dit verby is, kry ek presies dieselfde as die uitset. Dit laat my wonder wat die ontleder is vir?

Net een ding. Ek gebruik Expat. Wat lyk baie moeilik om te gebruik. My kode is hieronder: Dit lui in 'n lêer. Maar my aansoek sal 'n buffer wat deur 'n potjie sal ontvang, en nie van 'n lêer te ontleed. Is daar enige monsters van hierdie dat iemand?

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;
}
Was dit nuttig?

Oplossing

Dit het 'n rukkie om my kop rondom XML ontleding van draai (alhoewel ek doen dit in Perl, nie C). Basies, jy terugbel funksies registreer. Die ontleder sal jou terugbel ping vir elke node en slaag in 'n datastruktuur met allerhande sappige stukkies (soos skoonteks, enige eienskappe, kinders knope, ens). Jy moet 'n soort van die staat inligting in stand te hou -. Soos 'n hash boom jy dinge prop in, of 'n string wat al die guts bevat, maar nie een van die XML

Onthou net dat XML is nie lineêre en dit maak nie veel sin om dit te ontleed soos 'n lang homp van teks maak. In plaas daarvan, jy dit ontleed soos 'n boom. Sterkte.

Ander wenke

Expat 'n ewe-gedrewe ontleder. Jy moet code te gaan met tags, eienskappe, ens skryf en dan registreer die kode met die ontleder. Daar is 'n artikel hier wat beskryf hoe om te doen hierdie.

Met betrekking tot die lees van 'n voetstuk, afhangende van jou platform wat jy kan in staat wees om te behandel die socket soos soos 'n lêer te hanteer. Anders, wat jy nodig het om jou eie te lees uit die potjie en dan slaag die data uitdruklik expat. Daar is 'n API om dit te doen. Maar, sou ek probeer om dit te maak werk met gewone lêers kry eerste.

In plaas van expat, kan jy 'n blik op libxml2, wat waarskynlik reeds in jou verspreiding ingesluit het. Dit is 'n baie sterker as expat, en gee jou allerhande goodies: DOM (boom af), SAX (streaming af), XPath (onontbeerlik vir enigiets kompleks met XML IMHO doen) en nog baie meer. Dit is nie so lig as expat, maar dit is 'n baie makliker om te gebruik.

Wel, jy die mees ingewikkelde XML parser verkies (gebeurtenis gedrewe parsers is moeiliker om te hanteer). Hoekom Expat en nie libxml ?

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top