0

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

但我一直在寻找一种 XML 解析器,以便在我的一个在 Linux 上运行的应用程序中使用。

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

这是我正在阅读的文件:

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

但是,在我通过这个之后,我得到的输出与输出完全相同。这让我想知道解析器的用途是什么?

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

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

4 回答 4

3

Expat 是一个偶数驱动的解析器。您必须编写代码来处理标签、属性等,然后将代码注册到解析器。这里有一篇文章描述了如何做到这一点。

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

于 2009-03-04T03:08:14.793 回答
2

我花了一些时间来理解 XML 解析(虽然我是用 Perl 而不是 C 来做的)。基本上,您注册回调函数。解析器将为每个节点 ping 您的回调并传入包含各种多汁位(如纯文本、任何属性、子节点等)的数据结构。您必须维护某种状态信息——例如您插入的哈希树,或者包含所有内容但不包含 XML 的字符串。

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

于 2009-03-04T03:16:22.357 回答
2

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

于 2009-03-04T08:24:06.813 回答
0

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

于 2009-03-04T08:46:00.583 回答