【问题标题】:XML Schema to C++ Classes [closed]XML Schema 到 C++ 类 [关闭]
【发布时间】:2010-10-01 13:08:43
【问题描述】:

我必须编写一个 C++ 应用程序(使用 GUI 的 Qt 框架),它可以编辑存储在由 xsd 模式文件描述的 xml 文件中的数据。有没有将 xsd 架构转换为 C++ 类的工具?

【问题讨论】:

    标签: c++ xml qt xsd code-generation


    【解决方案1】:

    Altova XML Spy 可以从 XSD 生成 C++,它是商业的,但如果您想试用,可以免费试用 30 天。

    【讨论】:

      【解决方案2】:

      在我看来,CodeSynthesis 正是您要找的。它是开源和 c++ 的。

      【讨论】:

      • 值得注意的是,开源在这里有点棘手。 CodeSynthesis 生成的代码也受 GPL 许可保护,因此您不能在不分发整个应用程序的源代码的情况下在您的应用程序中使用它。不过,low volume usage 或专有许可证也有例外情况。
      • 我无法在 VS2019 中使用 CodeSynthesis
      【解决方案3】:

      我认为有一个 Microsoft 工具可以做到这一点,称为 xsd.exe(但我自己没有尝试过)。

      【讨论】:

      • 我可能是错的,但这似乎不支持 C++,仅支持 .Net C#、VB 和 J#
      • xsd.exe 不支持标准 C++,仅支持使用 CLR XML 内容的微软“托管”C++。
      • xsd.exe也可以生成.xsd转Cpp代码。stackoverflow.com/questions/59132321/…
      【解决方案4】:

      Codalogic LMX 也是一个选项。

      【讨论】:

        【解决方案5】:

        Objective Systems, Inc. XBinder XML Schema Compiler(不仅适用于 C++)。

        【讨论】:

          【解决方案6】:

          gSOAP Toolkit 也可以!它是轻量级的,并且支持 C/C++。我已经成功地在要求非常严格的项目中使用了它。此外,它在 GPL2 下获得许可。

          可移植性:gSOAP 支持大多数平台,包括嵌入式系统和小型操作系统(例如 WinCE、Symbian 和 PalmOS)。针对 Windows(98、XP、Vista)、Linux、Unix、Mac OS X、Solaris、HP-UX、AIX、FreeBSD、TRU64、Irix、QNX 和 VxWorks 测试了可移植性。

          【讨论】:

          • 似乎与 CodeSynthesis 生成器具有相同的许可限制。
          【解决方案7】:

          请参阅 Google 的 XmlPlus-xsd2cpp

          XmlPlus xsd2cpp 通过提供“简单易用”的 C++ XML 数据绑定 W3C XML 架构。

          GNU Lesser General Public License 涵盖了 XmlPlus 的使用

          【讨论】:

          • 请注意,该工具不是由 Google 提供的,它只是托管在 Google Code 上。
          • 看起来很有希望。不幸的是,xsd2cpp 并不支持每个 xsd 规范:/ 例如不支持属性组。
          • 该工具使用Expat基于SAX(带有回调的流解析)的解析器,这使得解析COLLADA等一些文档非常不方便。参考:installation institution
          【解决方案8】:

          所有的生成器都非常糟糕。

          XSD 描述了一个类层次结构,其中类包含子类,子类可能包含其他子类,您要做的就是以相同的方式表示它。

          例如,如果这是您的架构:

          <xs:element name="shipto">
            <xs:complexType>
              <xs:sequence>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="address" type="xs:string"/>
                <xs:element name="city" type="xs:string"/>
                <xs:element name="country" type="xs:string"/>
              </xs:sequence>
            </xs:complexType>
          </xs:element> 
          

          你想产生类似的东西:

          class shipTo
          {
            private:
              string name;
              string address;
              string city;
              string country;
          
            public:
              set_Name();
              get_Name();
              ...
          }
          

          你不会找到它。我找到的最接近的东西是 xjc,它是用于 Java 的。

          您会期望存在与此功能一样 BASIC 的东西,但我还没有找到它,是的,我使用了 Altova XML-Spy。我很惊讶有人会建议它作为代码生成器。它生成的代码非常糟糕。

          我正在编写一个 lex/bison 解析器来为我的项目执行此操作,因为到目前为止我能够找到的所有工具都会产生相当糟糕的代码。 Altova 有 30 天的试用期,如果您不相信我,请尝试一下。为我的 XSD 编写 lex/bison 解析器比使用 500 美元的专业代码包生成糟糕的类表示更容易。

          我不敢相信人们会在 C++ 中使用 XML,因为它的工具很糟糕。

          【讨论】:

          • 您能否向我们展示一个“坏工具”产生的例子,并解释您为什么认为它不好?
          • 无法回复,因为我在这里陷入了“迷你 Markdown 格式”。我给了你一个示例模式 - 继续运行 Altova XML spy 并将其与 MY hand rolling XSD->C++ lex/bison/hack 生成的示例进行比较。前进。我对可用的工具印象最深刻。 XJC 确实产生了相当好的代码,但是,它是用 Java 编写的,所以它不适合我。我觉得我正在使用石刀和熊皮。
          • 不要有 Altova 间谍...确实看到您提出的类结构并同意它看起来很合理。也许你可以用 1-2 句话解释 Altova 做了什么你不喜欢的事情。
          • 好吧,我的 AltovaSpy 试用许可证已过期,尽管我可以回溯我的计算机以使其正常工作,但我不会打扰。如果您真的想知道这些工具有多糟糕,只需获得试用许可证即可。 Altova 在视觉表现方面还不错。我可以这么说,它非常冗长,它们广泛使用极长的前缀名称,它们使用自己内部定义的类型而不是像“string”甚至“int”这样明显的东西,数据不存储在类本身中,而是在流内部,所以这相当于一个解析器而不是一组容器。
          • 使用流是为了处理非常大的 XML 文件的问题吗?
          猜你喜欢
          • 2020-03-26
          • 1970-01-01
          • 1970-01-01
          • 2017-06-11
          • 2010-09-12
          • 2013-08-08
          • 2010-12-15
          • 2013-03-22
          • 2019-07-22
          相关资源
          最近更新 更多