Pergunta

Isto pode parecer uma pergunta simples.

Mas eu tenho procurado para um analisador XML para uso em uma das minhas aplicações que está em execução no Linux.

Eu estou usando Expat e ter analisado o meu arquivo XML através da leitura de um em. no entanto, a saída é o mesmo que o de entrada.

Este é o meu arquivo que estou lendo em:

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

No entanto, depois de eu ter passado este, eu recebo exatamente o mesmo que o de saída. Isso me faz pensar que o analisador é para?

Só mais uma coisa. Eu estou usando Expat. Que parece bastante difícil de usar. Meu código está abaixo: Isto lê em um arquivo. Mas a minha aplicação terá de analisar um buffer que serão recebidos por um socket, e não a partir de um arquivo. Existe alguma amostras deste que alguém tem?

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;
}
Foi útil?

Solução

Demorou um pouco para envolver minha cabeça em torno de análise XML (embora eu fazê-lo em Perl, não C). Basicamente, você registrar funções de retorno de chamada. O analisador irá ping seu retorno de chamada para cada nó e passar em uma estrutura de dados contendo todos os tipos de pedaços suculentos (como texto simples, quaisquer atributos, nós filhos, etc). Você tem que manter algum tipo de informação de estado -. Como uma árvore de hash de conectar coisas em, ou uma string que contém todas as entranhas, mas nenhum do XML

Basta lembrar que XML não é linear e que não faz muito sentido para analisá-lo como um longo pedaço de texto. Em vez disso, você analisá-lo como uma árvore. Boa sorte.

Outras dicas

Expat é um analisador mesmo-driven. Você tem que escrever código para lidar com tags, atributos, etc e, em seguida, registrar o código com o analisador. Há um artigo aqui que descreve como fazer isso.

Em relação a leitura de um socket, dependendo da sua plataforma você pode ser capaz de tratar o soquete como como um identificador de arquivo. Caso contrário, você precisa fazer a sua própria leitura da tomada e, em seguida, passar os dados para expat explicitamente. Há uma API para fazer isso. No entanto, eu ia tentar fazê-lo funcionar com arquivos comuns em primeiro lugar.

Em vez de expatriados, você pode querer ter um olhar para libxml2, que provavelmente já está incluído na sua distribuição. É muito mais poderoso do que expatriados, e dá-lhe todos os tipos de guloseimas: DOM (modo de árvore), SAX (modo de streaming), XPath (indispensável fazer nada complexo com XML IMHO) e muito mais. Não é tão leve como expatriados, mas é muito mais fácil de usar.

Bem, você escolheu o analisador XML mais complicado (analisadores event-driven são mais difíceis de alça). Por Expat e não libxml ?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top