我使用CodeSynthesis XSD工具根据给定的XSD文件生成XML文件。我知道可以构建XML树并将其序列化为流。但我的问题是:
是否可以逐个生成XML元素?
假设我想要生成包含<root>
和<element1>
的{{1}}元素。现在我只能构建<element2>
树并将其序列化为一个整体。我想要的是:
首先生成<root>
,然后生成<root>
和<element1>...</element1>
,最后生成<element2>...</element2>
。
由于解析器支持回调,因此在节点可用后立即控制每个节点很容易。是否有可能进行树映射?
我挖掘了文档,但没有找到合适的答案。我会感谢任何可能的帮助或线索。在此先感谢:)
---编辑---
说清楚 - 首先,源XML数据是由我的程序生成的(而不是现有的XML文件);其次,我希望在生成XML对象后立即对其进行序列化,而不是序列化整个树。
我知道XSD / Tree目标是内存中的树状处理,但我想知道它是否可以写成</root>
和xxx_open
等。
再次感谢。
答案 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&);