什么是XML解析器?使用Expat

时间:2009-03-04 02:58:17

标签: c xml-parsing expat-parser

这似乎是一个简单的问题。

但我一直在寻找一个XML解析器,用于我在Linux上运行的一个应用程序。

我正在使用Expat并通过读取一个来解析我的XML文件。但是,输出与输入相同。

这是我正在阅读的文件:

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

然而,在我通过之后,我得到与输出完全相同的内容。它让我想知道解析器的用途是什么?

还有一件事。我正在使用Expat。这似乎很难使用。我的代码如下:这读取一个文件。但是我的应用程序必须解析一个缓冲区,该缓冲区将由套接字接收,而不是从文件接收。有没有人有这样的样品?

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;
}

4 个答案:

答案 0 :(得分:3)

Expat是一个偶数驱动的解析器。您必须编写代码来处理标签,属性等,然后使用解析器注册代码。有一篇文章here介绍了如何执行此操作。

关于从套接字读取,根据您的平台,您可以将套接字视为文件句柄。否则,您需要从套接字执行自己的读取,然后将数据显式传递给expat。有一个API可以做到这一点。但是,我首先尝试使用普通文件。

答案 1 :(得分:2)

我需要一段时间来解决XML解析问题(虽然我是在Perl中完成的,而不是C语言)。基本上,您注册回调函数。解析器将ping每个节点的回调并传入包含各种多汁位(如明文,任何属性,子节点等)的数据结构。您必须维护某种状态信息 - 例如插入内容的哈希树,或包含所有内容的字符串,但不包含任何XML。

请记住,XML不是线性的,将它解析为一大块文本没有多大意义。相反,你像树一样解析它。祝你好运。

答案 2 :(得分:2)

您可能希望查看libxml2而不是expat,它可能已经包含在您的发行版中。它比expat更强大,并为您提供各种好处:DOM(树模式),SAX(流模式),XPath(对XML恕我直言做任何复杂事情都是必不可少的)等等。它不像expat那样轻量级,但它更容易使用。

答案 3 :(得分:0)

嗯,您选择了最复杂的XML解析器(事件驱动的解析器更难处理)。为何选择Expat而不是libxml