我是编程新手,我想知道是否可以将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()
};
我感谢大家的答案。
答案 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可能就是您要找的。 p>
答案 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解析器的基本特征:
最后,如果你想要从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。