如何使用 Boost XML 解析器
How to use Boost XML Parser
我编写了一个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>
我该怎么办?我尝试了不同的解决方案,例如在"位置"类中获取"数据"类数组,但它不起作用。我更喜欢在我的项目中使用 Boost 库。(除非不可能!!(
Boost 没有 XML 库。
提升序列化不读取常规 XML(类似(文档。它仅读取 XML 存档。这意味着,您不控制 XML。
综上所述,您可以简单地使用另一个 Data 成员扩展类,这会意外地导致非常相似的 XML 存档。也许这对你来说已经足够好了:
住在科里鲁
#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);
}
}
写
<?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>
更新
如果您不想控制 XML,那就更好了。只需让库执行您希望它执行的操作:
住在科里鲁
#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);
}
}
在这种情况下,XML恰好如下所示:
<?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>
相关文章:
- 如何使用tinyxml2从XML加载父实体和子实体
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 使用 Tinyxml 在 xml 中添加一个子子项
- 在 c++ 中使用 vtd-xml 时,如何摆脱 EOFException?
- 使用 RapidXML 更新C++中的 XML 节点和属性值
- 使用 libxml2 解析 XML 文件时缺少元素值
- 使用 RapidXML 解析大型 XML(大小大于 65 KB)文件时出现问题
- 如何在 xml 中使用双引号?
- 使用 TinyXML2 读取 C++ 中的 XML 文件
- Xerces-C 使用硬编码的 xsd 验证 xml
- 使用 pugixml 将 xml 命名空间添加到xml_document
- OPENCV - 如何在OpenCV中使用Haar Cascade Github xml文件?
- 如何使用QXmlStreamReader解析包含对其他XML文件的引用的XML文件
- 如何使用libcurl c ++从url保存XML文件
- 尝试使用 RapidXML 将唯一的 XML 属性追加到节点
- 服务器状态到 XML 使用 fwrite?
- 如何使用 Boost XML 解析器
- 如何使用 pugixml 正确访问 xml 属性?
- 如何使用所有其他文件信息来编译代码,例如HAAR级联训练的权重的XML文件
- 将字符串转换为 XML 并使用提升更新值字段