引言
RapidXML 是一个轻量级 XML 解析库,核心接口围绕 文档解析、节点操作、属性操作 三大类展开。(基于 rapidxml.hpp 核心头文件)
一、文档操作(xml_document<> 类)
xml_document<> 是 XML 文档的核心对象,负责解析 XML 内容并管理节点树,常用接口如下:
接口函数 | 功能说明 | 示例 |
---|---|---|
parse |
解析 XML 字符串.Flags 为解析标志(如 0 表示默认模式)。 | doc.parse<0>(xml_str); // 解析 XML 字符串到文档对象 |
first_node(const char* name=0) | 获取文档的第一个节点(通常是根节点)。 | xml_node<>* root = doc.first_node("REFCTRL"); // 获取根节点 |
二、节点操作(xml_node<> 类)
xml_node<> 表示 XML 中的元素节点(如
接口函数 | 功能说明 | 示例 |
---|---|---|
first_node(const char* name=0) | 获取当前节点的第一个子节点。name 可选,指定子节点名称(如 "node")。 | xml_node<>* child = root->first_node("para"); // 获取第一个 |
next_sibling(const char* name=0) | 获取当前节点的下一个同级节点(共享同一父节点)。 | xml_node<>* next = child->next_sibling("node"); // 下一个 |
parent() | 获取当前节点的父节点。 | xml_node<>* parent = child->parent(); // 获取子节点的父节点 |
name() / name(const char* new_name) | 获取 / 设置节点的名称(如 "para"、"node")。 | cout << child->name(); // 输出节点名称 |
value() / value(const char* new_value) | 获取 / 设置节点的文本值(仅对文本节点有效,元素节点通常通过属性存储数据)。 | node->value("文本内容"); // 设置节点文本值 |
三、属性操作(xml_attribute<> 类)
接口函数 | 功能说明 | 示例 |
---|---|---|
first_attribute(const char* name=0) | 获取当前节点的第一个属性。name 可选,指定属性名称(如 "name")。 | xml_attribute<>* attr = node->first_attribute("name"); // 获取 name 属性 |
next_attribute(const char* name=0) | 获取当前属性的下一个同级属性(同一节点内的其他属性)。 | xml_attribute<>* next_attr = attr->next_attribute("value"); // 下一个 value 属性 |
name() / name(const char* new_name) | 获取 / 设置属性的名称(如 "name"、"main")。 | cout << attr->name(); // 输出属性名称 |
value() / value(const char* new_value) | 获取 / 设置属性的值(如 "22"、"50")。 | cout << attr->value(); // 输出属性值 |
四、代码示例
#include "rapidxml.hpp"
#include "rapidxml_utils.hpp"
#include <iostream>using namespace rapidxml;
using namespace std;int main()
{// 1. 读取文件file<> xmlFile("data.xml");// 2. 解析文档xml_document<> doc;try {doc.parse<0>(xmlFile.data());} catch (const parse_error& e) {return 1;}// 3. 获取根节点xml_node<>* root = doc.first_node("REFCTRL");// 4. 遍历子节点和属性for (xml_node<>* child = root->first_node(); child; child = child->next_sibling()) {cout << "子节点:" << child->name() << endl;// 5. 遍历节点属性for (xml_attribute<>* attr = child->first_attribute(); attr; attr = attr->next_attribute()) {cout << " 属性 " << attr->name() << ":" << attr->value() << endl;}}return 0;
}