这似乎是一个简单的问题。
但我一直在寻找一个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;
}
答案 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?