Question

Cela peut sembler une question simple.

Mais je recherchais un analyseur XML à utiliser dans l'une de mes applications tournant sous Linux.

J'utilise Expat et j'ai analysé mon fichier XML en en lisant un Cependant, la sortie est la même que l'entrée.

Ceci est mon fichier dans lequel je lis:

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

Cependant, après avoir passé cela, j'obtiens exactement le même résultat que la sortie. Je me demande à quoi sert l'analyseur?

Juste une dernière chose. J'utilise Expat. Ce qui semble assez difficile à utiliser. Mon code est ci-dessous: Cela se lit dans un fichier. Mais mon application devra analyser un tampon qui sera reçu par un socket et non par un fichier. Quelqu'un a-t-il des exemples de cela?

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;
}
Était-ce utile?

La solution

Il m'a fallu un certain temps pour comprendre l'esprit XML (bien que je le fasse en Perl, pas en C). Fondamentalement, vous enregistrez des fonctions de rappel. L'analyseur analysera votre rappel pour chaque nœud et transmettra une structure de données contenant toutes sortes de bits juteux (comme du texte en clair, des attributs quelconques, des nœuds enfants, etc.). Vous devez conserver certaines informations sur l'état, telles qu'un arbre de hachage dans lequel vous branchez des éléments ou une chaîne contenant tout le contenu, mais aucun élément XML.

N'oubliez pas que XML n'est pas linéaire et qu'il n'a pas beaucoup de sens de l'analyser comme un long morceau de texte. Au lieu de cela, vous analysez comme un arbre. Bonne chance.

Autres conseils

Expat est un analyseur pair. Vous devez écrire du code pour gérer les balises, attributs, etc., puis enregistrer le code auprès de l'analyseur. Un article ici décrit comment procéder. ceci.

En ce qui concerne la lecture depuis un socket, selon votre plate-forme, vous pourrez peut-être traiter le socket comme un descripteur de fichier. Sinon, vous devez faire votre propre lecture à partir du socket, puis transmettre les données à expat explicitement. Il y a une API pour le faire. Cependant, j’essayerais de le faire fonctionner au préalable avec des fichiers ordinaires.

Au lieu d'expat, vous voudrez peut-être jeter un œil à libxml2, qui est probablement déjà inclus dans votre distribution. C'est beaucoup plus puissant qu'expat, et vous donne toutes sortes de choses intéressantes: DOM (mode arborescence), SAX (mode diffusion), XPath (indispensable pour tout ce qui est complexe avec XML IMHO) et plus. Ce n’est pas aussi léger qu’expatrié, mais c’est beaucoup plus facile à utiliser.

Eh bien, vous avez choisi l’analyseur XML le plus compliqué (les analyseurs basés sur les événements sont plus difficiles à gérer). Pourquoi Expat et non libxml ?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top