# xml2cppobject
**Repository Path**: PatchLion_admin/xml2cppobject
## Basic Information
- **Project Name**: xml2cppobject
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MIT
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-06-30
- **Last Updated**: 2026-06-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# xml2cppobject
一个基于 pugixml 的轻量级 C++ 库,用于将 XML 数据映射到 C++ 对象。
## 功能特性
- **简单映射**:使用宏定义 XML 属性和子元素为 C++ 类成员
- **代码生成**:Python 脚本自动从 XML 文件生成 C++ 类
- **Pimpl 模式**:公共接口与私有实现的清晰分离
- **C++17**:现代 C++ 标准支持
- **跨平台**:支持 Windows、Linux 和 macOS
## 项目结构
```
xml2cppobject/
├── CMakeLists.txt # 根目录 CMake 配置
├── generate_classes.py # Python 代码生成脚本
├── xml2cppobject/ # 核心库
│ ├── CMakeLists.txt
│ ├── xmlobjectbase.h # 宏和基类头文件
│ └── xmlobjectbase.cpp # 实现
├── tests/ # 测试示例
│ ├── CMakeLists.txt
│ ├── test_school.cpp # 学校场景测试
│ ├── test_school.xml # 学校场景 XML
│ ├── test_keyword.cpp # C++ 关键字规避测试
│ └── test_keyword.xml # 关键字测试 XML
└── pugixml/ # 第三方 XML 解析器(子模块)
```
## 构建
### 环境要求
- CMake 3.10+
- C++17 编译器
- Python 3.x(用于代码生成)
### 构建步骤
```bash
# 克隆仓库
git clone <仓库地址>
cd xml2cppobject
# 初始化子模块
git submodule update --init --recursive
# 构建
cmake -B build
cmake --build build
```
### 构建选项
| 选项 | 默认值 | 说明 |
|--------|---------|-------------|
| `BUILD_TESTS` | ON | 构建测试程序 |
```bash
# 不构建测试
cmake -B build -DBUILD_TESTS=OFF
```
## 使用方法
### 手动定义类
#### 1. 创建 XML 文件
```xml
```
#### 2. 定义 C++ 类(通过generate_classes.py生成,见后面章节)
```cpp
#include "xmlobjectbase.h"
class Teacher : public XmlObjectBase
{
public:
Teacher() : XmlObjectBase() {}
Teacher(xml_node node) : XmlObjectBase(node) {}
DEFINE_ATTR(id);
DEFINE_ATTR(name);
DEFINE_ATTR(subject);
};
class Student : public XmlObjectBase
{
public:
Student() : XmlObjectBase() {}
Student(xml_node node) : XmlObjectBase(node) {}
DEFINE_ATTR(id);
DEFINE_ATTR(name);
DEFINE_ATTR(score);
};
class Class : public XmlObjectBase
{
public:
Class() : XmlObjectBase() {}
Class(xml_node node) : XmlObjectBase(node) {}
DEFINE_ATTR(id);
DEFINE_ATTR(name);
DEFINE_CHILD(Student, Student, student);
};
class School : public XmlObjectBase
{
public:
School() : XmlObjectBase() {}
School(xml_node node) : XmlObjectBase(node) {}
DEFINE_ATTR(name);
DEFINE_ATTR(address);
DEFINE_CHILD(Teacher, Teacher, teacher);
DEFINE_CHILD(Class, Class, cls);
};
```
#### 3. 在代码中使用
```cpp
#include "school.h"
#include
int main()
{
XmlRoot root;
if (!root.loadRootXml("school.xml")) {
std::cerr << "加载 XML 失败!" << std::endl;
return -1;
}
// 从 root 创建 School 对象
auto school = root.object("School");
// 访问属性
std::cout << "学校:" << school->_name().value() << std::endl;
// 遍历子元素
for (size_t i = 0; i < school->teacherCount(); ++i) {
auto teacher = school->teacher(i);
std::cout << "老师:" << teacher->_name().value() << std::endl;
}
return 0;
}
```
### 自动代码生成
使用 `generate_classes.py` 从 XML 自动生成 C++ 类:
```bash
python generate_classes.py <类前缀> <输出目录>
```
**参数说明:**
- `xml路径`:XML 文件路径
- `类前缀`:生成类名的前缀(如 "Abc" 将生成 AbcSchool)
- `输出目录`:生成的头文件输出目录
**示例:**
```bash
# 生成带 "Test" 前缀的类
python generate_classes.py tests/test_school.xml "Test" build/tests/generated
```
这将在 `build/tests/generated/test_school.h` 中生成以下类:
- `TestSchool`
- `TestTeacher`
- `TestClass`
- `TestStudent`
### C++ 关键字规避
代码生成器自动处理 C++ 关键字,通过添加 `_` 后缀:
- 属性名 `class` 变为 `_class_`
- 元素名 `public` 变为 `public_`
- 类名 `Class`(首字母大写)不是关键字,保持不变
支持的关键字包括所有 C++20 保留字:`class`、`struct`、`public`、`private`、`const`、`virtual`、`int`、`for`、`while` 等。
## 宏参考
### DEFINE_ATTR(attrname)
定义 XML 属性的 getter 和 setter 方法。
**生成的方法:**
- `xml_attribute _attrname() const` - 获取属性
- `void set_attrname(xml_attribute attr)` - 设置属性
### DEFINE_CHILD(classtype, nodename, membername)
定义访问子元素的方法。
**生成的方法:**
- `classtype* object(const char* name, size_t index)` - 按索引获取子元素
- `std::vector objects(const char* name)` - 获取所有子元素
- `size_t membernameCount() const` - 获取子元素数量
- `classtype* membername(size_t index)` - 按索引获取(便捷方法)
- `std::vector membernameAll()` - 获取所有子元素(便捷方法)
## 类参考
### XmlObjectBase
所有 XML 映射对象的基类。
**方法:**
- `node()` - 获取底层 xml_node
- `attributeKeys()` - 获取所有属性名
- `childKeys()` - 获取所有子元素名(去重)
- `attribute(name)` - 按名称获取属性
- `processEachAttribute(func)` - 遍历所有属性
### XmlRoot
加载 XML 文档的根类。
**方法:**
- `loadRootXml(path)` - 从文件加载 XML
- `writeToFile(path)` - 将 XML 写入文件
- `node()` - 获取文档元素
## 许可证
本项目使用:
- **pugixml**:MIT 许可证(见 pugixml/LICENSE.md)
- **xml2cppobject**:MIT 许可证
## 依赖
- [pugixml](https://github.com/zeux/pugixml) - 轻量、简单、快速的 C++ XML 解析器