65.9K
CodeProject 正在变化。 阅读更多。
Home

简单的 C++ XML 写入类

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (30投票s)

2003 年 12 月 5 日

2分钟阅读

viewsIcon

217217

downloadIcon

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 文档更具可读性(例如,添加换行符、填充等)。

© . All rights reserved.