将XML转换为C结构体,以及将C结构体转换为XML

7

我喜欢用C语言编写服务器端程序,但需要与一些XML进行交互。

我需要编写一些函数,给定一个C结构体或嵌套结构体,以及另一个描述C结构体元素(或嵌套结构体)的结构体(或嵌套结构体),将其作为XML输出。还需要另一个函数读取XML,验证它是否与C结构体的描述匹配,并填充C结构体。

我非常确定这已经做过很多次了,但是有关XML的其他信息太多了,我无法组成一个不返回大量无关信息的Google查询。

我不需要一个库,只需要几百行C代码来解析XML。


2
同意C语言不是全新Web应用程序的正确选择,但如果他有一个成熟的代码库呢?即使重新开始会在长期内使事情变得更容易,我们也并不总是有重新开始的奢侈。 - snowcrash09
因为有时我的东西会登上像digg.com这样的网站的首页,而我并不想在强大的托管上花费太多。这也真的真的减少了依赖性,这使得当有人许可代码(这也偶尔发生)时它变得更好。 但是同意 - 任何时候你开始频繁调用malloc(),C都不是正确的语言。这就是为什么我通常使我的字符串长度固定并避免malloc。 - Matthias Wandel
@JoshPetitt 当然有一些情况下C语言是一个很好的选择,但是OP暗示他并不是被迫使用C语言来完成这个项目,因为他在问题开头说“我喜欢用C语言来编写服务器端程序”,而不是“我必须使用C语言来完成这个项目”。我并不是想要引发一场语言之争,我可以用更少对抗性的方式表达我的第一条评论。如果我的话给您留下了错误的印象,我很抱歉。 - William Brendel
@WilliamBrendel,没问题,我可能也太严厉了。我已经删除了我的原始评论。 - Josh Petitt
@WilliamBrendel,那嵌入式系统这样的小目标呢?我想从更全面的Web服务器中发出和解析XML,但没有更全面的Web服务器的资源和内置功能。如果C是唯一的选择怎么办? - Josh Petitt
显示剩余3条评论
3个回答

4
他并不是在寻求一个XML解析器。他需要的是一个能够自动将复杂的C结构体序列化/反序列化成XML的库(这显然需要依赖于底层的XML解析器)。 Libpdel虽然有些老旧,但支持你所需的功能(通过“structs”相关功能实现)。

2

如果您没有找到任何预先制作的库或代码,可以编写一个类似于通常的toString()函数的toXML()函数。然后再编写一个toStruct(char*)函数,将XML反序列化回结构体。


2
是的,就像那样。如果有现成的代码可以做到这一点,我希望避免编写类似的代码。 - Matthias Wandel

2
您无法仅用几百行代码在一般情况下解析XML。有几个XML解析库可供选择,其中expat是其中之一。Expat使用C编写,并具有友好的C API。
假设您不会在支持的数据类型上大量使用,那么序列化可能更容易。
无论哪种方式,这都将在维护struct布局和XML模式之间的对应关系方面带来麻烦。
您可能需要查看像SCEW这样的库,它旨在隐藏expat实现的事件驱动性质,并呈现更像DOM树的东西。还有各种实现SOAP的库,它们必须处理将数据编组进出XML数据包的过程。

1
解析XML是容易的部分(有很多比expat更容易的库,比如libxml)。困难的部分是C结构体和XML之间的双向映射/转换。 - bortzmeyer
@RBerteig,你有关于结构布局和XML模式的任何资源吗?我认为这是问题的关键(也是我的问题)。理想情况下,我正在寻找始终映射到C结构和反之亦然的XML子集。我意识到XML文档和C结构在根本上是不同的。但是,我希望找到两者之间的共同点,可以用作规范。 - Josh Petitt
@JoshPetitt,我手头没有任何资源。我会从将简单的“struct”映射到带有属性的标签开始。这对于像struct point {int x; int y;}这样的东西非常有效,可以写成<point x ='5' y ='17'>。这适用于没有指针和可以用(非常)纯文本编写的数据类型的POD。另一个标记可用于收集数组。当您需要表示任意字符串数据、树以外的结构、指针等时,情况变得更加有趣……也不要忘记安全问题。安全序列化很难。 - RBerteig
@RBerteig,谢谢你的提示。我擅长C语言,但对XML的细节不是很熟悉(我对XML的了解主要是从实践中积累起来的)。我希望能有一个XML专家提供一个模式,以便我可以编写我的C应用程序。我不使用在服务器上使用DTD或任何使用DTD的东西。 - Josh Petitt
@JoshPetitt 这可能是JSON更好的答案的情况,除非您有一个仅通过XML满足的外部要求。有几个C库可用于JSON,并且该格式足够简单,以便人类可以阅读它,因为它是JavaScript结构化数据表示的精心选择的子集。有许多与JSON及其使用相关的SO问题。 - RBerteig
显示剩余3条评论

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