boost库中读取xml的函数 read_xml的第一个参数不支持中文路径?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了boost库中读取xml的函数 read_xml的第一个参数不支持中文路径?相关的知识,希望对你有一定的参考价值。

using boost::property_tree::ptree;
ptree pt;
boost::array<string,400> tmpList;
read_xml(“E:\新建文件夹\test.xml”, pt);

会抛异常 can not open

如何才能让它支持中文路径

boost内部实际上用的是STL的串流

有时候用ifstream或ofstream打开带有中文路径的文件会失败。

解决办法:
1、使用C语言的函数设置为中文运行环境
setlocale(LC_ALL,"Chinese-simplified");

2、使用STL函数设置为系统语言环境
std::locale::global(std::locale(""));

当然选2啦!
参考技术A 中文路径 转义一下吧 用 urlencode

提升读/写 XML 文件:如何更改字符编码?

【中文标题】提升读/写 XML 文件:如何更改字符编码?【英文标题】:Boost read/write XML file: how to change the characters encoding? 【发布时间】:2015-03-07 23:45:30 【问题描述】:

我正在尝试使用 Boost 函数 read_xmlwrite_xml 读取/写入 XML 文件。 XML文件的原始编码是“windows-1252”,但是经过读写操作后,编码变成了“utf-8”。

这是 XML 原始文件:

<?xml version="1.0" encoding="windows-1252" standalone="no" ?>
<lot>
  <name>Lot1</name>
  <lot_id>123</lot_id>
  <descr></descr>
  <job>
    <name>TEST</name>
    <num_items>2</num_items>
    <item>
      <label>Item1</label>
      <descr>Item First Test</descr>
    </item>
    <item>
      <label>Item2</label>
      <descr>Item Second Test</descr>
    </item>
  </job>
</lot>

这是输出:

<?xml version="1.0" encoding="utf-8"?>
<lot>
    &#10;&#10;  &#10;&#10;  &#10;&#10;  &#10;&#10;  &#10;&#10;  &#10;&#10;  &#10;&#10;  &#10;&#10;
  <name>Lot1</name>
  <lot_id>123</lot_id>
  <descr></descr>
  <job>
    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;    &#10;  
    <name>TEST</name>
    <num_items>2</num_items>
    <item>
      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;    
      <label>Item1</label>
      <descr>Item First Test</descr>
    </item>
    <item>
      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;      &#10;    
      <label>Item2</label>
      <descr>Item Second Test</descr>
    </item>
  </job>
</lot>

这是我的 C++ 代码(只是一个测试代码):

#include <boost/property_tree/ptree.hpp>
#include <boost/property_tree/xml_parser.hpp>
using boost::property_tree::ptree;

ptree xmlTree;
read_xml(FILE_XML, xmlTree);

for (auto it = xmlTreeChild.begin(); it != xmlTreeChild.end();)

    std::string strItem = it->first.data();
    if (strcmp(strItem.c_str(), "item") == 0)
    
        std::string strLabel = it->second.get_child("label").data();
        if (strcmp(strLabel.c_str(), "item3") != 0)
        
            it = xmlTreeChild.erase(it);
        
           
    ++it;


auto settings = boost::property_tree::xml_writer_make_settings<std::string>('\t', 1);
write_xml(FILE_XML, xmlTree, std::locale(), settings);

我需要使用与原始文件相同的编码来读取和重写文件。 我还尝试使用以下方法更改区域设置:

std::locale newlocale1("English_USA.1252");
read_xml(FILE_XML, xmlTree, 0, newlocale1);
...
auto settings = boost::property_tree::xml_writer_make_settings<std::string>('\t', 1);
write_xml(FILE_XML, xmlTree, newlocale1, settings);

但我得到了相同的结果。

如何使用原始文件编码和 Boost 函数进行读写?

谢谢

【问题讨论】:

【参考方案1】:

您可以通过编写器设置传递编码:

auto settings = boost::property_tree::xml_writer_make_settings<std::string>(
    '\t', 1, "windows-1252");

当然,请确保键/值实际上是 latin1/cp1252 兼容的(只要您从源文件中读取所有信息,这才有意义;但是,在将用户输入分配给属性树时,您必须小心节点;您可能需要先将输入编码转换为 cp1252)。

Live On Coliru

【讨论】:

【参考方案2】:

您也可以按如下方式写入字符串流:

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

boost::property_tree::ptree pt;
std::ostringstream oss;
write_xml(
    oss, pt,
    boost::property_tree::xml_writer_make_settings<char>(
                  '\t', 0, "ASCII"));

【讨论】:

以上是关于boost库中读取xml的函数 read_xml的第一个参数不支持中文路径?的主要内容,如果未能解决你的问题,请参考以下文章

Boost read_xml 问题解析字符串?

plyr 的 ldply 改变了 read_xml 的行为

提升读/写 XML 文件:如何更改字符编码?

如何使用 pd.read_xml 正确解析 SEC cal.xml 文件?

AttributeError:模块“pandas”没有属性“read_xml”或“to_xml”

使用 Boost 的属性树添加 XML 标头 [重复]