Boost库,使用std :: wstring作为文件名,使用boost :: property_tree :: read_xml

时间:2014-08-29 20:56:57

标签: c++ xml boost wstring widestring

我最近开始使用std::wstring而不是std::string来避免使用非ASCII字符的奇怪结果,而且我找不到一种方法来读取路径类型的XML文件std::wstring使用boost库。

我现在使用boost库很安静。

我使用boost::property_tree::read_xml函数和boost::property_tree::wptree而不是通常的ptree结构。但遗憾的是,我无法将std::wstring作为read_xml的第一个参数,这使得它变得更难。

我的问题是,是否有任何解决方法可以读取路径被调节为std::wstring的XML文件?

提前致谢!

2 个答案:

答案 0 :(得分:2)

您可以使用Boost文件系统支持file_descriptor_sink的Boost Iostreams wpath设备:

#include <boost/property_tree/xml_parser.hpp>
#include <boost/iostreams/device/file_descriptor.hpp>
#include <boost/iostreams/stream.hpp>
#include <boost/filesystem.hpp>
#include <iostream>

namespace pt = boost::property_tree;
namespace io = boost::iostreams;
namespace fs = boost::filesystem;

int main()
{
    fs::wpath const fname = L"test.xml";
    io::file_descriptor_source fs(fname);
    io::stream<io::file_descriptor_source> fsstream(fs);

    pt::ptree xml;
    pt::read_xml(fsstream, xml);

    for (auto const& node : xml.get_child("root"))
        std::cout << node.first << ": " << node.second.get_value<std::string>() << "\n";
}

请参阅 Live On Coliru ,使用输入文件:

<root>
    <child nodetype="element" with="attributes">monkey show</child>
    <child nodetype="element">monkey do</child>
</root>

并打印:

child: monkey show
child: monkey do

答案 1 :(得分:0)

我找到了一个相当简单的工作解决方案,我所做的就是使用std::wifstream作为boost::property_tree::read_xml方法的第一个参数。

基本上是三行代码:

boost::property_tree::wptree pt;
std::wifstream f(L"C:/äöå/file.xml");
boost::property_tree::read_xml(f, pt);