【问题标题】:xml parsing using boost使用boost解析xml
【发布时间】:2015-01-20 04:45:04
【问题描述】:

我正在使用 BOOST 库解析下面的 xml 文件-

<da>
        <m_day Type="int">15</m_day>
        <m_month Type="int">8</m_month>
        <m_year Type="int">1947</m_year>
</da>

我的 cpp 代码是:

    #include <boost/archive/xml_oarchive.hpp> 
    #include <boost/archive/xml_iarchive.hpp>
    #include <iostream> 
    #include <fstream> 

    typedef struct date { 
        unsigned int m_day;
        unsigned int m_month;
        unsigned int m_year;
        date( int d,  int m,  int y) : m_day(d), m_month(m), m_year(y) 
        {}
        date() : m_day(1), m_month(1), m_year(2000) 
        {}
        friend std::ostream& operator << (std::ostream& out, date& d) 
        {
            out << "day: " << d.m_day 
                  << " month: " << d.m_month
        << " year: " << d.m_year;
            return out;
        }
        template<class Archive>
        void serialize(Archive& archive, const unsigned int version)
        {
        archive & BOOST_SERIALIZATION_NVP(m_day);
            archive & BOOST_SERIALIZATION_NVP(m_month);
            archive & BOOST_SERIALIZATION_NVP(m_year);
        }
    } date;

    BOOST_CLASS_IMPLEMENTATION(date, boost::serialization::object_serializable);//object_serializable);

    unsigned int flags =   boost::archive::no_header;


    int main()
    {

     std::ifstream file1("archive.xml");
     boost::archive::xml_iarchive ia(file1,flags);
     date dr;
     ia >> BOOST_SERIALIZATION_NVP(dr);


     std::ofstream file("archive2.xml");
      boost::archive::xml_oarchive oa(file,flags);
    //  date da(15, 8, 1947);
      oa & BOOST_SERIALIZATION_NVP(dr);


    return 0;
    }

我遇到以下错误:

在抛出 'boost::archive::archive_exception' 的实例后调用终止 what(): 输入流错误 中止(核心转储)

对于没有属性的普通 xml(如下所述),上面的代码工作正常

<da>
        <m_day>15</m_day>
        <m_month>8</m_month>
        <m_year>1947</m_year>
</da>

但是对于之前的xml文件,代码有问题吗?你能告诉我boost是否可能吗?我已经搜索了很多以找到答案,但没有得到任何答案。 提前致谢!!!

【问题讨论】:

  • 这不起作用,因为您的文档不是序列化存档。 Boost 序列化格式不是免费的

标签: c++ xml boost


【解决方案1】:

Boost 序列化不是 XML 库。

Boost Archive xml_[io]archive 也不是 XML 库。

见鬼,甚至 Boost Property Tree 都不是 XML 库。

简而言之:Boost 不包含 XML 库


稍微长一点:您可以使用 Boost Property Tree 来解析您的 XML。它在底层使用 RapidXML 的衍生产品,您可以使用 Boost Property Tree 读取/写入 相当 通用 XML 文档。

实际上,Property Tree 界面非常具体,经常会导致混乱。没有太多的控制权。

如果您关心您的 XML 支持(命名空间?空格?排序?PCDATA?处理指令?XPath?编码?...)请考虑使用 XML 库 (What XML parser should I use in C++?)

奖励:带有 Boost 属性树的示例

这是使用 Boost 属性树的方法

Live On Coliru

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

typedef struct date { 
    unsigned int m_day;
    unsigned int m_month;
    unsigned int m_year;
    date( int d=1,  int m=1,  int y=2000) : m_day(d), m_month(m), m_year(y) {}

    friend std::ostream& operator << (std::ostream& out, date& d) {
        return out << "day: " << d.m_day << " month: " << d.m_month << " year: " << d.m_year;
    }

    void load(boost::property_tree::ptree const& pt)
    {
        m_day = pt.get("da.m_day", 1);
        m_month = pt.get("da.m_month", 1);
        m_year = pt.get("da.m_year", 2000);
    }
} date;

#include <sstream>

int main() {
    std::istringstream iss("<da>\n"
                "<m_day Type=\"int\">15</m_day>\n"
                "<m_month Type=\"int\">8</m_month>\n"
                "<m_year Type=\"int\">1947</m_year>\n"
                "</da>\n");

    boost::property_tree::ptree pt;
    read_xml(iss, pt);

    date d;
    d.load(pt);

    std::cout << d << "\n";
}

打印

day: 15 month: 8 year: 1947

【讨论】:

  • 添加了一个基于 Boost Property Tree 的代码示例(不想只是玩世不恭:))
  • 实际上我的要求是反序列化xml并将其放入strruc一侧并将其发送到另一侧。另一方面,我将序列化来自这个结构的数据并形成一个 XML。这就是我使用 Boost 序列化的原因。您能否提供使用 Boost 序列化而不是 Boost 属性树的解决方案。感谢您的建议
  • @harshini 你没抓住重点。你不能。除非您可以更改 XML(或者愿意为此目的实现一个全新的 xml 存档),否则不会。这是一个完全不同的问题(完全相反),在我看来,你应该把它作为一个新问题来问。
  • @harshini 干杯。没问题。遗憾的是,答案没有改变。
  • @harshini 我现在很困惑。重复问题不会改变答案。并不是我不想想要。这不是图书馆所做的。
【解决方案2】:

Boost Serialization 不支持编写 XML 属性,显然也不支持读取它们,甚至忽略它们。其中一位作者在这里写道:http://boost.2283326.n4.nabble.com/serialization-How-to-serialize-as-an-XML-attribute-td2557918.html

您可以在加载 XML 之前对其进行预处理,使用另一个 XML 库(如 Expat 或其他)。

【讨论】:

    猜你喜欢
    • 2012-12-10
    • 1970-01-01
    • 2023-03-06
    • 2017-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-18
    相关资源
    最近更新 更多