简单的 C++ XML 写入类






4.86/5 (30投票s)
2003 年 12 月 5 日
2分钟阅读

217217

5074
基于微型模板的 C++ 类,简化了 XML 数据的写入。
引言
在我的一些程序中,我必须以 XML 格式写入数据。 仅写入:读取和解析是其他一些工具的任务。 实际上,我只需要使用一些特定的标记写入简单的纯文本。
为此,我实现了一个简单的类,其行为与通常的 std::stream
相同,但也会跟踪所有需要的 XML 标记。 类的实现非常简单,并且是基于模板的。 可以写入 XmlStream
,所有可以写入 std::ostream
的内容都可以。 标签和属性由特殊的辅助函数声明。
使用代码
请看下面的示例,它说明了关于我的类的一切(我特别省略了 XmlStream
类的实现,如果你对此感兴趣,你可以下载源代码,我想)。
ofstream f("sample.xml");
XmlStream xml(f);
xml << prolog() // write XML file declaration
<< tag("sample-tag") // root tag
<< tag("some-tag") // child tag
<< attr("int-attribute") << 123
<< attr("double-attribute") << 456.789
<< chardata() << "This is the text"
<< endtag() // close current tag
<< tag("empty-self-closed-tag") // sibling of <some-tag>
<< endtag()
<< tag() << "computed-name-tag"
<< attr("text-attr") << "a bit of text"
<< endtag()
<< tag("deep-tag") // deep enclosing
<< tag("sub-tag-2")
<< tag("sub-tag-3")
<< endtag("deep-tag"); // close all tags up to specified
// you don't worry about closing all open tags!
正如你所看到的,写入 XML 变成了一个非常简单的过程。 XmlStream
将所有传入的数据委托给指定的 std::ostream
(在上面的示例中为 std::ofstream
),除了标签和属性声明,这些声明由辅助函数发出:tag()
, endtag()
, attr()
, chardata()
和 prolog()
。 要填充属性值和标签字符数据,应该使用标准流操作。 如果某个类的对象可以写入 std::ostream
,它也会自动地写入我的 XmlStream
。 此功能由模板 operator<<
释放,它主要调用标准流操作。
template<class t> XmlStream& operator<<(const t& value) {
// for computed-name tags we have to remember written data
if (stateTagName == state)
// tagName is object of std::ostringstream class
tagName << value;
// now call specified std::stream which
// performs actual output
s << value;
return *this;
}
最终的可执行文件仅包含此运算符的实现,这些实现与实际使用的数据类型相对应。
我的方法的优点
- 写入 XML 数据的速度非常快(几乎与纯文本写入一样快)。
- 您可以使用标准且众所周知的函数来构建 XML 文档的内容。 很容易实现新的
operator
来支持任何用户类。 - 写入 XML 数据的源代码本身代表了结果文档的结构。
XmlStream
确实是一个很小的类! 几乎所有的工作都放在一个重载的operator<<
中。
缺点
- 所有数据都按原样写入 XML,没有任何编码(UTF-8、UTF-16 等)。 在我的任务中,这通常不是一个令人头疼的问题,因为我的数据要么是拉丁字母,要么是数字。 但对于常见情况,可能需要实现特殊的
std::ostream
(实际上是:std::streambuf
)后继者,它将执行编码工作。 XmlStream
不检查输出的 XML 数据是否代表格式良好的 XML 文档。 程序员必须自己检查标签和属性名称是否有效,并且属性值和字符数据中是否没有特殊字符(如尖括号)。
特点
当前版本的 XmlWriter
用于我的程序中,该程序以 XML 格式输出科学计算的结果。 如果有人想改进这个简单的类,他可能首先摆脱上述缺点。 也可以更改标签的处理方式,使输出的 XML 文档更具可读性(例如,添加换行符、填充等)。