信息发布→ 登录 注册 退出

c++怎么解析XML文件_c++XML数据读取与DOM解析教程

发布时间:2025-11-10

点击量:
使用tinyxml2库可轻松实现C++中XML文件的DOM解析。首先将tinyxml2.h和cpp文件加入项目,然后通过XMLDocument加载文件,获取根节点后遍历book元素,利用Attribute和GetText方法提取id、title、author、price及currency等信息,适合处理中小型XML文件。

在C++中解析XML文件,常用的方法是使用第三方库来读取和操作XML数据。原生C++标准库并不支持XML解析,因此开发者通常借助像 tinyxml2pugixmlXerces-C++ 这样的库。本文以 tinyxml2 为例,介绍如何读取XML文件并使用DOM方式解析内容。

1. tinyxml2 简介与安装

tinyxml2 是一个轻量级、易于使用的C++ XML解析库,采用DOM(Document Object Model)方式加载整个XML文档到内存中,适合处理中小型XML文件。

你可以从其 GitHub 仓库下载:https://github.com/leethomason/tinyxml2

使用方法:

  • 将 tinyxml2.h 和 tinyxml2.cpp 添加到你的项目中
  • 在编译时包含这两个文件即可

2. 基本XML结构示例

假设我们有如下XML文件(example.xml):



  
    C++ Primer
    Stanley Lippman
    59.99
  
  
    Effective C++
    Scott Meyers
    45.00
  

3. 使用 tinyxml2 解析XML文件

下面是一个完整的C++程序,演示如何读取上述XML文件,并提取每本书的信息:

#include 
#include "tinyxml2.h"

using namespace tinyxml2; using namespace std;

int main() { XMLDocument doc; XMLError result = doc.LoadFile("example.xml");

if (result != XML_SUCCESS) {
    cout zuojiankuohaophpcnzuojiankuohaophpcn "无法加载XML文件!错误代码:" zuojiankuohaophpcnzuojiankuohaophpcn result zuojiankuohaophpcnzuojiankuohaophpcn endl;
    return -1;
}

// 获取根节点
XMLNode* root = doc.FirstChild();
if (!root) {
    cout zuojiankuohaophpcnzuojiankuohaophpcn "根节点为空!" zuojiankuohaophpcnzuojiankuohaophpcn endl;
    return -1;
}

// 遍历所有 book 子节点
for (XMLElement* book = root-youjiankuohaophpcnFirstChildElement("book");
     book != nullptr;
     book = book-youjiankuohaophpcnNextSiblingElement("book")) {

    // 获取属性 id
    const char* id = book-youjiankuohaophpcnAttribute("id");

    // 获取子元素文本
    const char* title = book-youjiankuohaophpcnFirstChildElement("title")-youjiankuohaophpcnGetText();
    const char* author = book-youjiankuohaophpcnFirstChildElement("author")-youjiankuohaophpcnGetText();

    XMLElement* priceElem = book-youjiankuohaophpcnFirstChildElement("price");
    const char* price = priceElem-youjiankuohaophpcnGetText();
    const char* currency = priceElem-youjiankuohaophpcnAttribute("currency");

    cout zuojiankuohaophpcnzuojiankuohaophpcn "ID: " zuojiankuohaophpcnzuojiankuohaophpcn id zuojiankuohaophpcnzuojiankuohaophpcn ", ";
    cout zuojiankuohaophpcnzuojiankuohaophpcn "书名: " zuojiankuohaophpcnzuojiankuohaophpcn title zuojiankuohaophpcnzuojiankuohaophpcn ", ";
    cout zuojiankuohaophpcnzuojiankuohaophpcn "作者: " zuojiankuohaophpcnzuojiankuohaophpcn author zuojiankuohaophpcnzuojiankuohaophpcn ", ";
    cout zuojiankuohaophpcnzuojiankuohaophpcn "价格: " zuojiankuohaophpcnzuojiankuohaophpcn price zuojiankuohaophpcnzuojiankuohaophpcn " " zuojiankuohaophpcnzuojiankuohaophpcn currency zuojiankuohaophpcnzuojiankuohaophpcn endl;
}

return 0;

}

4. 关键API说明

  • XMLDocument::LoadFile():加载XML文件,返回错误码
  • FirstChildElement("tag"):获取第一个指定标签的子元素
  • NextSiblingElement("tag"):遍历同级的下一个同名元素
  • Attribute("name"):获取元素的属性值
  • GetText():获取元素的文本内容

注意:所有返回的字符串指针由tinyxml2内部管理,不要手动释放。如需长期保存,应复制为std::string。

基本上就这些。tinyxml2简单直观,适合大多数C++项目的XML读取需求。对于更复杂的场景(如命名空间、大文件流式处理),可考虑 pugixml 或 Xerces-C++。但对新手来说,tinyxml2是入门DOM解析的最佳选择。

标签:# 指针  # 如需  # 但对  # 为例  # 这两个  # 第一个  # 你可以  # 本书  # 加载  # 是一个  # 遍历  # https  # dom  # Attribute  # c++  # 字符串  # xml  # 命名空间  # Object  # String  # 标准库  # xml解析  # stream  # ios  # ai  # github  # node  # git  
在线客服
服务热线

服务热线

4008888355

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!