【问题标题】:CodeSynthesis XSD tree serialization on the flyCodeSynthesis XSD 树的动态序列化
【发布时间】:2015-02-21 04:48:55
【问题描述】:

我正在使用 CodeSynthesis XSD 工具根据给定的 XSD 文件生成 XML 文件。我知道可以构建 XML 树并将其序列化为流。但我的问题是:

是否可以一一生成XML元素?

假设我想生成一个包含<element1><element2><root> 元素。现在我只能构建<root> 树并将其序列化为一件。我想要的是:

首先生成<root>,然后生成<element1>...</element1><element2>...</element2>,最后生成</root>

因为解析器支持回调,所以很容易在节点可用后立即控制每个节点。树映射也可以吗?

我挖掘了文档,但没有找到正确的答案。我将不胜感激任何可能的帮助或线索。在此先感谢:)

--- 编辑---

为了清楚起见——首先,源 XML 数据是由我的程序生成的(不是来自现有的 XML 文件);其次,我想在生成 XML 对象后立即对其进行序列化,而不是对整个树进行序列化。

我知道 XSD/Tree 目标在内存中的树状处理上,但我想知道是否可以写成 xxx_openxxx_close 等。

再次感谢。

【问题讨论】:

    标签: c++ xml codesynthesis


    【解决方案1】:

    是的,可以使用 CodeSynthesis XSD 一个一个地生成元素。例如,这个 streaming example 生成这个 XML 文件:

    <?xml version="1.0" encoding="UTF-8" standalone="no" ?>
    <op:object xmlns:op="http://www.codesynthesis.com/op" id="123" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.codesynthesis.com/op position.xsd">
      <header>
        <name>Lion's Head</name>
        <type>rock</type>
      </header>
      <position lat="-33.8569" lon="18.5083"/>
      <position lat="-33.8568" lon="18.5083"/>
      <position lat="-33.8568" lon="18.5082"/>
      <position lat="-33.857" lon="18.5083"/>
      <position lat="-33.8569" lon="18.5084"/>
      <position lat="-33.857" lon="18.5084"/>
      <position lat="-33.857" lon="18.5082"/>
      <position lat="-33.8569" lon="18.5082"/>
    </op:object>
    

    在文件 driver.cxx 中,每个位置元素都是通过调用生成的

    s.next ("position", pos);
    

    要更好地控制将在输出中使用哪些命名空间前缀,您可以使用此函数,而不是从文件 serializer.hxx 中

    // Serialize next object model fragment into an element with the specified
    // namespace and qualified name as well as namespace declarations.
    //
    template <typename T>
    void
    next (const std::string& ns,
          const std::string& name,
          const namespace_infomap&,
          const T& x);
    

    在文件 driver.cxx 中,位置对象是从 XML DOM 树中创建的

    position pos (*doc1->getDocumentElement ());
    

    所以使用的是这个构造函数:

    position (const ::xercesc::DOMElement& e,
              ::xml_schema::flags f = 0,
              ::xml_schema::container* c = 0);
    

    可以在生成的文件position.hxx中看到。

    但是您提到您是从非 XML 源创建对象,因此您需要使用将成员值作为输入的构造函数:

    position (const lat_type&,
              const lon_type&);
    

    【讨论】:

    • 非常感谢您的帮助。我查看了流式示例的代码,但发现它与我想要的有点不同 - 数据源。我需要通过程序的另一部分生成数据并将它们输入something(可能是xsd/tree生成的类),然后立即将其作为XML对象生成到流(可能是打开的文件)中 - 因为数据可以太大而无法放入内存。 AFAK,xsd/tree 生成只能序列化根元素的序列化,包括 XML 标头声明。我不确定是否有办法只序列化 XML 实例的片段...?
    • 请注意,创建 CodeSynthesis 数据对象时有不同类型的构造函数。我用更多解释更新了我的答案。也许我的答案中缺少这条信息?
    • 非常感谢。终于发现next_open()函数接受了代码创建的XML节点实例。实际上这个例子本身就是一个很好的库。另一点是(可能对其他人有用),该示例适用于 XSD 4.x 并且不支持 XSD 3.x... :-)
    猜你喜欢
    • 2010-09-14
    • 2019-11-28
    • 1970-01-01
    • 1970-01-01
    • 2017-09-25
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    相关资源
    最近更新 更多