嵌入式系统的C XML库

22

我正在为一个嵌入式系统的项目工作,该系统使用XML来获取和传输数据。我不希望XML处理变成一堆使用snprintf()/strcat()等函数构建XML字符串或通过计算"<"和">"字符解析XML的位操作。

我找到了几个XML库,其中有几个甚至可能足够小,但最接近C的是C ++,这对于这个系统来说不可行。我希望能找到一个符合以下约束条件的XML库:

  • C源代码
  • 没有动态内存分配
  • 便宜。免费更好,但Copyleft不行。

它不必是一个完整的解析器-我只想能够从嵌套元素中提取文本,并且有一个相当简单的方式来生成XML,不依赖于格式字符串。目前未使用属性,因此该库甚至不需要支持它们。XML文档将非常小,因此类似DOM的东西就可以了,只要它能与客户端提供的缓冲区一起使用(在原地解析原始XML会很好)。

PugXML和TinyXML看起来非常接近,但我希望有人知道一个专门为基于C的嵌入式系统量身定制的XML库,而我在谷歌上搜寻时漏掉了它。


1
有些“Copyleft”库的作者可能愿意并能够向您出售其代码的替代商业使用许可证。 - caf
7
如果我处在你的位置,由于嵌入式系统的限制,我会认真考虑替代XML的方案。根据数据的性质,可能存在更好的封装数据的方式,这些方式不需要太多的处理开销来进行生成和解析。 - Craig McQueen
我们遇到了类似的情况,但找不到任何小型库,所以我最终为嵌入式系统编写了一个二进制大小<20K的库,但它使用堆。它仅支持带名称空间的ASCII字符。希望我能帮到你,但这是专有软件 :( - Manish
1
我意识到JSON是一个很好的替代方案,相比XML需要更少的解析工作。编写一个解析器并不会太复杂,你可以轻松地只用堆栈而不需要使用堆。 - too honest for this site
我已经尝试过ezxml,它是一个非常易于使用的嵌入式系统的完美C库,您可以用它来构建和解析XML。 - Abdessamad Doughri
6个回答

13

我不了解动态内存分配,但一个标准的C语言XML解析器是expat,它是许多解析器的底层库。


我一直使用 Expat 都有良好的经验。它是用标准 C 编写的,因此在任何平台上都能轻松移植。它是一种流解析器,因此不应该耗尽内存来构建 DOM。你需要习惯 'callback' API 但是当你掌握了它时它就相当简单了。强烈推荐! - James Anderson
Expat确实进行了一些动态内存分配。不过,代码相当局限,您可能能够重新实现。它是一个非常好的XML解析器。 - anon
1
如果您使用XML_ParserCreate_MM创建解析器,它将使用您提供的malloc和free的实现。 - Pete Kirkham

4

我不确定,但也许Mini-XML:轻量级XML库能够帮助您:

  1. Mini-XML只需要支持ANSI C语言的编译器。
  2. 这是免费软件。
  3. 它的二进制文件大小约为100k。
  4. 它解析整个XML文件,然后将所有信息存储到链表中。

1
看起来像是开源软件,而不仅仅是免费软件 :-) 这是一个重要的区别。 - Nicklas Avén

1

1
我已经尽可能地让 sxmlc 简单易用,我知道人们在路由器中使用它来执行 Web 查询的原地解析。但不幸的是(我晚了五年……),它确实使用了内存分配,虽然保持在最小限度:一个缓冲区用于读取每个“XML 行”(即介于 <> 之间的内容,抱歉;)和许多小缓冲区用于跟踪标记名称、属性名称和值以及文本(尽管我一直想为这些使用char[16]或类似的东西)。而且它使用了strdup/strcpy等函数。因为我希望任何人都可以自由使用它,所以许可证是 BSD。

1
你可以使用来自Gnome的这个

0

在这种情况下,使用Xerces-C库是最优选择。

如果XML文件比较小,为什么不使用sprintf或其他方法进行程序生成,并使用字符串提取函数来解析它呢?但是如前所述,如果XML文件比较大,建议使用开源的Xerces-c库。


3
Xerces-C 相当庞大,是用 C++ 编写的。 - Indy9000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接