是的,可以使用 CodeSynthesis XSD 一个一个地生成元素。例如,这个
流式传输示例
生成这个 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&);