Увеличить библиотеку, используя std :: wstring в качестве имени файла с boost :: property_tree :: read_xml

Я недавно начал использовать std::wstring вместо std::string чтобы избежать странных результатов с не-ASCII символами, и я не нашел способ прочитать файл XML, где путь имеет тип std::wstring используя библиотеку наддува.

Я использую увеличение библиотека тихая в наши дни.

Я использую boost::property_tree::read_xml функция с boost::property_tree::wptree вместо обычной структуры дерева. Но, к сожалению, я не могу прокормить std::wstring в качестве первого параметра read_xml, который делает все это сложнее.

У меня вопрос, есть ли обходной путь для чтения файла XML, где путь хранится в виде std::wstring?

Заранее спасибо!

2

Решение

Вы можете использовать Boost Iostreams file_descriptor_sink устройство, которое поддерживает wpath из Boost Filesystem:

#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";
}

Видеть это Жить на Колиру где он использует входной файл:

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

и печатает:

child: monkey show
child: monkey do
2

Другие решения

Я нашел рабочее решение, которое было довольно простым, все, что я сделал, это использовал 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);
0

По вопросам рекламы [email protected]