QxOrm入门教程03.03:XML

系列索引:QxOrm入门教程索引

本文介绍XML相关操作。

工程

创建一个纯C++工程,设置pro

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
include(D:\gsdf\include\QxOrm\QxOrm.pri)

CONFIG += c++17 console
DEFINES += _BUILDING_USER
# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

!contains(DEFINES, _QX_NO_PRECOMPILED_HEADER) {
PRECOMPILED_HEADER = precompiled.h
}

INCLUDEPATH += D:\gsdf\include\QxOrm\include

LIBS += -LD:\gsdf\lib -lQxOrmd

HEADERS += \
user.h

SOURCES += \
main.cpp \
user.cpp

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

主要就是添加QxOrm包含文件,设置预编译头文件,添加链接库

源码

预编译

对应的precompiled.h文件

1
2
3
4
5
6
#ifndef PRECOMPILED_H
#define PRECOMPILED_H

#include <QxOrm.h>

#endif // PRECOMPILED_H

注意,预编译相关设置一定要有,否则编译会报错。

User类

头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifndef USER_H
#define USER_H

#include "QxCommon/QxMacro.h"
#include "QxOrm.h"
#include "QxRegister/QxRegister.h"
#include "QxPrecompiled.h"
#include "QxOrm_Impl.h"

class User
{
public:
User() : id(0) { }
virtual ~User() { }

long id;
QString name;
int age;
};

QX_REGISTER_HPP_EXPORT_DLL(User, qx::trait::no_base_class_defined, 1)

#endif // USER_H

实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include "user.h"

QX_REGISTER_CPP_EXPORT_DLL(User)

namespace qx {
template <> void register_class(QxClass<User> & t)
{
// 注册 User::id <=> 数据库中的主键
t.id(&User::id, "id");

// 注册 User::name 属性,使用的 key 是 name,version 是 1。
t.data(&User::name, "name", 1);

// 注册 User::age 属性,使用的 key 是 age。
t.data(&User::age, "age");
}
}

主程序文件

main文件,与sql处理类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include "QxOrm_Impl.h"
#include "QxDao/QxSqlDatabase.h"
#include "QxDao/QxDao.h"
#include "QxCommon/QxCache.h"

#include "user.h"

int main(int argc, char *argv[])
{
// 创建 3 个用户
// 可以使用 std 和 Qt 智能指针:std::shared_ptr、QSharedPointer 等...
typedef QSharedPointer<User> UserPtr;
UserPtr u1;
u1.reset(new User());
u1->name = "Jack Ma";
u1->age = 30;

UserPtr u2;
u2.reset(new User());
u2->name = "Pony";
u2->age = 25;

UserPtr u3;
u3.reset(new User());
u3->name = "Waleon";
u3->age = 18;

// 将所有用户插入容器中
// 可以使用 std、boost、Qt 和 qx::QxCollection<Key,Value> 中的许多容器
typedef QVector<UserPtr> VectorUser;
VectorUser users;
users.push_back(u1);
users.push_back(u2);
users.push_back(u3);

#if _QX_SERIALIZE_XML
// 将容器中的用户导出到 XML 文件中(序列化)
qx::serialization::xml::to_file(users, "./export_users.xml");

// 将 XML 中的用户导入至新容器
VectorUser usersXmlTmp;
qx::serialization::xml::from_file(usersXmlTmp, "./export_users.xml");
#endif

return 0;
}

运行

编译运行,可以在本地发现export_users.xml文件。

内容为

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<QVector-QSharedPointer-User-- class_id="0" tracking_level="0" version="0">
<count>3</count>
<item class_id="1" tracking_level="0" version="0">
<qt_shared_ptr class_id="2" tracking_level="1" version="1" object_id="_0">
<id>0</id>
<name class_id="3" tracking_level="0" version="0">Jack Ma</name>
<age>30</age>
</qt_shared_ptr>
</item>
<item>
<qt_shared_ptr class_id_reference="2" object_id="_1">
<id>0</id>
<name>Pony</name>
<age>25</age>
</qt_shared_ptr>
</item>
<item>
<qt_shared_ptr class_id_reference="2" object_id="_2">
<id>0</id>
<name>Waleon</name>
<age>18</age>
</qt_shared_ptr>
</item>
</QVector-QSharedPointer-User-->

QxOrm入门教程03.03:XML
https://blog.jackeylea.com/qxorm/how-to-access-xml-with-qxorm/
作者
JackeyLea
发布于
2025年5月6日
许可协议