如何将XML节点转换为C ++结构?

时间:2010-09-16 12:41:43

标签: c++ xml

我是编程新手,我想知道是否可以将XML节点转换为C ++结构。 例如,我有一个包含以下XML的文件:

<?xml version="1.0" encoding="utf-8"?>
<StrucDescription>
  <StrucName>
    <unStrucNameMember1 type="uint16">0</unStrucNameMember1>
    <unStrucNameMember2 type="uint8">0</unStrucNameMember2>
    <ulStrucNameMember3 type="int32">0</ulStrucNameMember3>
    <bStrucNameMember4 type="bool">true</bStrucNameMember4>
    <szStrucNameMember5 type="char" size="32"></szStrucNameMember5>
  </StrucName>
</StrucDescription>

是否可以从以上的XML创建用于未来数据存储的波纹管结构?

struct StrucName
{
  uint16  unStrucNameMember1;
  uint8   unStrucNameMember2;
  int32   ulStrucNameMember3;
  bool    bStrucNameMember4;
  char   szStrucNameMember5[32];

  StrucName ()
  : unStrucNameMember1(0)
  , unStrucNameMember2(0)
  , ulStrucNameMember3(0)
  , bStrucNameMember4(true)
  , szStrucNameMember5()
};

我感谢大家的答案。

9 个答案:

答案 0 :(得分:6)

为XML文档创建编程语言构造称为XML data binding。如果您想在(编译时)之前执行此操作,请使用Google C++ xml data binding。到目前为止,我见过的最有希望的工具是XSD from Codesynthesis。它可以作为GPLed版本使用。 (请注意,您需要一个描述文件的XML模式。)

如果要在运行时(动态)为任意XML结构执行此操作 - 这是不可能的。既然你写的是“新编程”,我建议从一本C ++初学者书开始,然后很快就会明白为什么它是不可能的:你(或工具)编写源代码结构及其用法。要通过此名称来引用您的StrucName,您必须在编写代码时(即在编译时)知道您有此名称的XML标记。如果您只是在运行时知道XML布局及其名称,则不能在源代码中引用这些名称,因为它们尚不为人所知。

答案 1 :(得分:4)

这是XML Parsers的工作。一个易于设置的优秀xml解析器是Tiny XML

答案 2 :(得分:2)

如果在编译时知道结构的类型,则可以使用XML-parser。在C ++中,无法在运行时动态创建类型(在您的情况下为struct)。如果您想生成代码以便以后使用XML-Schema,this可能就是您要找的。

答案 3 :(得分:2)

C ++没有本机XML解析实用程序。你必须得到一个外部库,比如Xerces。

答案 4 :(得分:1)

如果您的XML文档遵循XSD架构,则可以使用gSOAP从XSD生成C / C ++ struct并在这些结构和XML文档之间进行转换。 (尽管此工具旨在与SOAP一起使用,但这可以独立于使用SOAP来完成。)

答案 5 :(得分:0)

AFAIK,你不能用C ++动态创建一个结构。

您需要根据XML文件的格式定义结构;通常这样的事情是在设计时完成的。

微米。

答案 6 :(得分:0)

您要求动态生成结构是不可能的。

在C ++中,结构应该在编译时知道。有代码生成工具可以读取XSD文件并为您生成结构。然后,您可以在代码中进行集成。

此类代码生成很常见,通常是构建过程的一部分,因此无论何时架构的描述发生更改,结构都会重新生成。

但是,如果要解析任意xml,则不能进行这样的简单绑定,因为C ++结构/类在运行时不会发展。

但是,您可以使用泛型类,将数据绑定到字段中,这就是DOM解析器的基本特征:

  • TinyXml的
  • 的Xerces
  • ...

最后,如果你想要从xml文件动态生成的结构,你需要动态语言,如Python或Ruby,它们支持在运行时添加/删除对象的属性。如果性能不是问题,这可能会更容易。

此外,解释器通常附带大量文档齐全的库,其中包括Xml和Json解析器。

答案 7 :(得分:0)

如果您有一个描述XML类型的XSD,那么有些产品可以生成C ++类,您可以使用这些类来读取文档,然后使用API​​来访问和修改文档。可以做到这一点的最好的商业产品之一是HydraExpress by Rogue Wave Software。这种软件将生成C ++代码,您可以编译并链接到您的程序。在支持反射和动态对象创建的语言中,它通常比生成的接口具有更好的性能。

免责声明,我是HydraExpress软件的开发人员。如果你需要一个免费的解决方案,那里有其他选择可能符合你的需求,我建议你尝试一些,找到最合适的选择。根据我的偏见,如果您需要性能,商业层支持以及比类似免费产品更易于使用的解决方案,HydraExpress是一个不错的选择。这确实需要花钱,但有一个试用版可以从网站上下载。

答案 8 :(得分:-2)

是的,这是可能的。我建议你为ruby,python和/或perl重新提出你的问题,因为他们都有一个适合读取你的XML定义的XML解析库,并且它可能比更高性能更快速地开始重量级C ++等价物。循环遍历结构定义并对字段使用内部循环,打印出您想要生成的C ++代码。如果您确实想使用C ++,可以尝试使用libxml2或xerces。