如何使用 Boost XML 解析器

2024-02-24

我编写了一个 XML 解析器来读取 XML 文件并将其转换为我的“Position”类的对象。效果很好。请看下面它的代码。

XML 文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="15">
<position class_id="0" tracking_level="0" version="0">
    <Degrees>1</Degrees>
    <Minutes>2</Minutes>
    <Seconds>3</Seconds>
    <data class_id="1" tracking_level="0" version="0">
        <Degrees>1</Degrees>
        <Minutes>2</Minutes>
        <Seconds>3</Seconds>
    </data>
</position>
</boost_serialization>

职位类别:

#ifndef XMLMANAGER_POSITION_H
#define XMLMANAGER_POSITION_H

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

class Data
{
public:
    int Degrees;
    int Minutes;
    float Seconds;
private:
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version){
        ar & BOOST_SERIALIZATION_NVP(Degrees);
        ar & BOOST_SERIALIZATION_NVP(Minutes);
        ar & BOOST_SERIALIZATION_NVP(Seconds);
    }
};
class Position
{

public:
    // every serializable class needs a constructor
    Position() {
        Degrees = 0;
        Minutes = 0;
        Seconds = 0;
    };
    Position(int degrees, int minutes, float seconds){
        Degrees = degrees;
        Minutes = minutes;
        Seconds = seconds;
    };
    int Degrees;
    int Minutes;
    float Seconds;
    Data data;

private:
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int version){
        ar & BOOST_SERIALIZATION_NVP(Degrees);
        ar & BOOST_SERIALIZATION_NVP(Minutes);
        ar & BOOST_SERIALIZATION_NVP(Seconds);
        ar & BOOST_SERIALIZATION_NVP(data);
    }
};

#endif //XMLMANAGER_POSITION_H

主功能:

    // Load an Object from XML
    std::ifstream ifs("/tests/r.karimi/XmlManager/data/Output.xml");
    boost::archive::xml_iarchive ixa(ifs);
    Position newPosition;
    try
    {
        ixa >> BOOST_SERIALIZATION_NVP(newPosition);
    }
    catch (std::exception const &ex)
    {
        std::cerr << ex.what() << std::endl;
    }
    std::cout << "Degree " << newPosition.Degrees <<
              " Minutes " << newPosition.Minutes <<
              " Seconds " << newPosition.Seconds << std::endl;
    std::cout << "Degree " << newPosition.data.Degrees <<
              " Minutes " << newPosition.data.Minutes <<
              " Seconds " << newPosition.data.Seconds << std::endl;

现在,我想解析以下 XML:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="15">
<position class_id="0" tracking_level="0" version="0">
    <Degrees>0</Degrees>
    <Minutes>0</Minutes>
    <Seconds>0.000000000e+00</Seconds>
    <data class_id="1" tracking_level="0" version="0">
        <Degrees>1</Degrees>
        <Minutes>2</Minutes>
        <Seconds>3</Seconds>
    </data>
    <data class_id="1" tracking_level="0" version="0">
        <Degrees>4</Degrees>
        <Minutes>5</Minutes>
        <Seconds>6</Seconds>
    </data>
</position>
</boost_serialization>

我应该怎么办?我尝试了不同的解决方案,例如在“Position”类中获取“Data”类的数组,但它不起作用。我更喜欢在我的项目中使用 Boost 库。 (除非不可能!!!)


升压确实not有一个 XML 库。

Boost Serialization 不读取一般的 XML(类似)文档。它读取 XML 档案only。这意味着,您无法控制 XML。

总而言之,您可以简单地用另一个数据成员扩展该类,并且它会偶然生成非常相似的 XML 存档。也许这对你来说已经足够了:

Live On Coliru http://coliru.stacked-crooked.com/a/6a1187e3585d1779

#include <boost/archive/xml_oarchive.hpp>

class Data
{
public:
    int Degrees;
    int Minutes;
    float Seconds;
private:
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int /*version*/){
        ar & BOOST_SERIALIZATION_NVP(Degrees);
        ar & BOOST_SERIALIZATION_NVP(Minutes);
        ar & BOOST_SERIALIZATION_NVP(Seconds);
    }
};

class Position
{

public:
    // every serializable class needs a constructor
    Position() {
        Degrees = 0;
        Minutes = 0;
        Seconds = 0;
    };
    Position(int degrees, int minutes, float seconds){
        Degrees = degrees;
        Minutes = minutes;
        Seconds = seconds;
    };
    int Degrees;
    int Minutes;
    float Seconds;
    Data data;
    Data data2;

private:
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int /*version*/){
        ar & BOOST_SERIALIZATION_NVP(Degrees);
        ar & BOOST_SERIALIZATION_NVP(Minutes);
        ar & BOOST_SERIALIZATION_NVP(Seconds);
        ar & boost::serialization::make_nvp("data", data);
        ar & boost::serialization::make_nvp("data", data2);
    }
};

#include <fstream>

int main() {
    Position position;
    position.Degrees = 1;
    position.Minutes = 2;
    position.Seconds = 3;
    position.data = {1,2,3};
    position.data2 = {4,5,6};

    {
        std::ofstream ofs("output.xml");
        boost::archive::xml_oarchive oa(ofs);

        oa << BOOST_SERIALIZATION_NVP(position);
    }
}

Writes

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="14">
<position class_id="0" tracking_level="0" version="0">
    <Degrees>1</Degrees>
    <Minutes>2</Minutes>
    <Seconds>3.000000000e+00</Seconds>
    <data class_id="1" tracking_level="0" version="0">
        <Degrees>1</Degrees>
        <Minutes>2</Minutes>
        <Seconds>3.000000000e+00</Seconds>
    </data>
    <data>
        <Degrees>4</Degrees>
        <Minutes>5</Minutes>
        <Seconds>6.000000000e+00</Seconds>
    </data>
</position>
</boost_serialization>

UPDATE

如果您不想控制 XML,那就更好了。只需让库做你想做的事:

Live On Coliru http://coliru.stacked-crooked.com/a/6088ece005868bbe

#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/serialization/vector.hpp>

class Data
{
public:
    int Degrees;
    int Minutes;
    float Seconds;
private:
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int /*version*/){
        ar & BOOST_SERIALIZATION_NVP(Degrees);
        ar & BOOST_SERIALIZATION_NVP(Minutes);
        ar & BOOST_SERIALIZATION_NVP(Seconds);
    }
};

class Position
{

public:
    // every serializable class needs a constructor
    Position() {
        Degrees = 0;
        Minutes = 0;
        Seconds = 0;
    };
    Position(int degrees, int minutes, float seconds){
        Degrees = degrees;
        Minutes = minutes;
        Seconds = seconds;
    };
    int Degrees;
    int Minutes;
    float Seconds;
    std::vector<Data> data;

private:
    friend class boost::serialization::access;

    template<class Archive>
    void serialize(Archive & ar, const unsigned int /*version*/){
        ar & BOOST_SERIALIZATION_NVP(Degrees);
        ar & BOOST_SERIALIZATION_NVP(Minutes);
        ar & BOOST_SERIALIZATION_NVP(Seconds);
        ar & boost::serialization::make_nvp("data", data);
    }
};

#include <fstream>

int main() {
    {
        Position position;
        position.Degrees = 1;
        position.Minutes = 2;
        position.Seconds = 3;
        position.data = { {1,2,3}, {4,5,6 } };

        std::ofstream ofs("output.xml");
        boost::archive::xml_oarchive oa(ofs);

        oa << BOOST_SERIALIZATION_NVP(position);
    }
    {
        std::ifstream ifs("output.xml");
        boost::archive::xml_iarchive ia(ifs);

        Position position;
        ia >> BOOST_SERIALIZATION_NVP(position);
    }
}

在这种情况下,XMLhappens看起来像:

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE boost_serialization>
<boost_serialization signature="serialization::archive" version="14">
<position class_id="0" tracking_level="0" version="0">
    <Degrees>1</Degrees>
    <Minutes>2</Minutes>
    <Seconds>3.000000000e+00</Seconds>
    <data class_id="1" tracking_level="0" version="0">
        <count>2</count>
        <item_version>0</item_version>
        <item class_id="2" tracking_level="0" version="0">
            <Degrees>1</Degrees>
            <Minutes>2</Minutes>
            <Seconds>3.000000000e+00</Seconds>
        </item>
        <item>
            <Degrees>4</Degrees>
            <Minutes>5</Minutes>
            <Seconds>6.000000000e+00</Seconds>
        </item>
    </data>
</position>
</boost_serialization>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Boost XML 解析器 的相关文章

随机推荐

  • 为什么图像没有保存在我的代码中而只是由管理页面保存?

    我需要知道为什么图像不保存在路径中 我从路径中检查 静态根和媒体根似乎都工作良好 但图像未保存 这里是代码 您可以在其中看到发生了什么 notice 该图像工作正常 并已通过管理页面安装 但无法保存或通过我的代码工作 模型 py class
  • Power Query M - 表达式错误 - 列表到文本

    我正在使用 Web Contents 执行 API 请求 我提交了一个从函数获取的动态访问令牌 let Source Json Document Web Contents https api url com endpoint id Head
  • 捕获蓝牙远程快门事件

    我想知道如何 是否可以在 android 中捕获由蓝牙远程快门事件触发的事件 例如这样的一个 http www avancaproducts com en shop other bluetooth camera shutter remote
  • 在 docker 中运行 json-server

    我一直在跑步json 服务器 https github com typicode json server使用以下配置在 docker 容器中成功运行了一段时间 泊坞窗文件 FROM node alpine EXPOSE 3000 COPY
  • 在自定义 UIGestureRecognizer 中实现速度

    我编写了一个自定义 UIGestureRecognizer 它可以用一根手指处理旋转 它的设计工作方式与 Apple 的 UIRotationGestureRecognizer 完全相同 并返回相同的值 现在 我想实现速度 但我无法弄清楚苹
  • 我应该使用 XSD 1.1 来构建开放标准吗?

    我们被要求为开放 XML 标准整合一组模式 XSD 1 0 可以处理大多数规则 但在某些地方会有点混乱 特别是考虑到可扩展性 它还依赖于实现者以注释的形式阅读某些规则的自由文本描述 几乎所有规则都可以使用 XSD 1 1 来实现 但是我们不
  • Java不发送客户端证书

    我在 Java 1 7 上使用 HttpClient 4 2 3 连接到 nginx 托管的远程服务器 我的组织广泛使用 PKI 并且远程和客户端都具有由通用 CA 颁发的证书 服务器有一个如下的签名链 CN Server 123 OU S
  • .NET 中泛型集合和非泛型集合之间的内存使用差异

    我读到收藏品如今在 NET 中 众所周知 使用有一些优点通用集合 over 非通用的 它们是类型安全的 没有转换 没有装箱 拆箱 这就是通用集合具有性能优势的原因 如果我们认为非泛型集合将每个成员存储为object 那么我们可以认为泛型也具
  • 适用于 OS X 的虚拟 HID 键盘

    我正在尝试创建一个虚拟的蓝牙Mac 操作系统的键盘客户端 这意味着我的 Mac 将充当 BT KB 我读到了 OS X 中的蓝牙 API 在 ObjC 中 并且我还发现了适用于 Mac 的 HID API 在 C 中 为了完成这项工作 我知
  • 如何使用Android Studio获取代码覆盖率?

    我正在使用 Android Studio 开发应用程序 我能够运行测试代码 但是 我不知道如何在 android studio 中获得代码覆盖率 我已经看过以下链接 Android Gradle 代码覆盖率 https stackoverf
  • PHP/MYSQL 父子关系

    我有一个这样的表 id name 父 ID 然后我想根据它们的 id 选择某些行 所以像这样 SELECT FROM TABLE WHERE id IN 1 5 8 9 35 我想从这个查询中也显示父 子关系 例如 id parent 1
  • AWS S3图像保存丢失元数据

    我正在使用用 python 2 7x 编写的 AWS Lambda 函数 该函数下载 保存到 tmp 然后将图像文件上传回存储桶 我的图像元数据从带有 http 标头 例如 Content Type image jpeg 等 的原始存储桶开
  • 如何以编程方式设置 app:srcCompat="@drawable/pic" 的 ImageButton 属性?

    如何设置ImageButton的财产 app srcCompat drawable pic 以编程方式 就像是myImageButton setBackgroundResource R drawable eng2 但财产app srcCom
  • 当我尝试连接到服务器时出现“远程服务器超时”异常

    尝试连接时openfire服务器通过以下代码 Connection connection new XMPPConnection https 192 168 0 101 5222 connection connect 我收到一个异常 上面写着
  • 将 NULL 日期时间值从 T-SQL 返回到 C# DataTable ==> DataRow 而不是空字符串

    该值 row 10 来自 DataRow 对象 来自 T SQL 中的 SQL 结果集 我相信它有一个 对象 类型 在我的数据库中 该特定记录的该字段的值为 NULL 但它在结果集中返回空字符串 而不是空值 我想解决根本问题并让我的结果集返
  • RDCOMClient (Outlook) - ggplot

    我正在使用RDCOMClient用于创建 Outlook 电子邮件的库 我想发送一个ggplot作为电子邮件正文内的图像 内联 not作为附件 我认为这可能的唯一方法是将绘图作为图像添加到HTMLBody财产 我尝试了两种不同的方法来在 h
  • XAML 中的中心弹出窗口

    我使用以下代码创建了一个弹出窗口 但我不知道如何将其居中我尝试在运行时自动更改边距 但我不知道该怎么做 但是有人知道如何使弹出窗口居中吗 它没有标准维度 因为我需要全球化我的程序
  • Android android.view.InflateException 二进制 XML 文件第 16 行:错误膨胀类片段

    这是 MainActivity 类 import java io BufferedReader import java io IOException import java io InputStream import java io Inp
  • Asp.net Web API 2.2 OData4 是否支持 group by 子句?

    Asp net Web API 2 2 OData v4 是否支持聚合和 group by 子句 我找不到任何决定性的答案 另一种方法是使用以下方式实现您的服务QueryByCube提供的linq扩展方法自适应LINQ http www a
  • 如何使用 Boost XML 解析器

    我编写了一个 XML 解析器来读取 XML 文件并将其转换为我的 Position 类的对象 效果很好 请看下面它的代码 XML 文件