使用Boost的属性树添加XML标头

时间:2014-12-15 13:36:33

标签: c++ xml boost boost-propertytree

我一直在研究XML阅读器/编写器,我使用了Boost的属性树来实现这一目标。

一切正常,输出文件中只缺少一件事:我想在文件顶部添加两个标题标签。现在,唯一的标题是这一个,由Boost的write_xml()函数自动编写:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>

但是,我想在已经存在的地方下面加上这两个:

<!-- Custom stylesheet -->
<?xml-stylesheet type="text/xsl" href="browser_view.xslt"?>
<!-- Authentic View -->
<?xmlspysps authentic_view.sps?>

有没有人知道如何在不使用Boost生成文件的情况下编辑文件后才能做到这一点?

1 个答案:

答案 0 :(得分:2)

这个词是“处理指令”。而且我很确定你不能(为什么他们会实现呢?毕竟没有Boost Xml库。)

在仔细检查xml_writer_settings后,确实没有任何东西可以控制处理指令的打印(否则你可能会抑制它们,而是自己打印整个序言)。

以下是我对PugiXML的看法:

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
#include <iostream>

#include <pugixml.hpp>

int main() {

    std::stringstream ss;

    {
        boost::property_tree::ptree pt;
        pt.add("demo", "bla");
        boost::property_tree::xml_parser::write_xml(ss, pt);
    }

    {
        pugi::xml_document doc;
        doc.load(ss);

        auto pi = doc.prepend_child(pugi::xml_node_type::node_pi);
        pi.set_name("xmlspysps");
        pi.set_value("authentic_view.sps");

        pi = doc.prepend_child(pugi::xml_node_type::node_pi);
        pi.set_name("xml-stylesheet");
        pi.set_value("type=\"text/xsl\" href=\"browser_view.xslt\"");

        doc.save_file("test.xml");
    }
}

保存:

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="browser_view.xslt"?>
<?xmlspysps authentic_view.sps?>
<demo>bla</demo>

当然,如果你真的想要序列化一个ptree,这是非常低效的 - 但显然你不是只是序列化。你正在标记,你需要一个标记库,最好是一个支持XML的文件库。