CodeSynthesis XSD树序列化即时

时间:2014-12-23 03:27:41

标签: c++ xml codesynthesis

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

是否可以逐个生成XML元素?

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

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

由于解析器支持回调,因此在节点可用后立即控制每个节点很容易。是否有可能进行树映射?

我挖掘了文档,但没有找到合适的答案。我会感谢任何可能的帮助或线索。在此先感谢:)

---编辑---

说清楚 - 首先,源XML数据是由我的程序生成的(而不是现有的XML文件);其次,我希望在生成XML对象后立即对其进行序列化,而不是序列化整个树。

我知道XSD / Tree目标是内存中的树状处理,但我想知道它是否可以写成</root>xxx_open等。

再次感谢。

1 个答案:

答案 0 :(得分: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中,每个position元素都是通过调用

生成的
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&);