tinyxml2开源库使用

源码下载:GitHub - leethomason/tinyxml2: TinyXML2 is a simple, small, efficient, C++ XML parser that can be easily integrated into other programs.

1.加载tinyxml2库

解压上面现在的压缩包,将tinyxml2.h/tinyxml2.cpp添加到项目工程当中,要使用该库时,只需要使用对于的头文件即可

#include "tinyxml2.h"

2.创建XML文件
cpp 复制代码
int test_tinyxml2_create()
{
    const char *declaration = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
    tinyxml2::XMLDocument doc;
    tinyxml2::XMLError ret = doc.Parse(declaration);
    if (ret != 0)
    {
        fprintf(stderr, "fail to parse xml file: %s\n", declaration);
        return -1;
    }

    tinyxml2::XMLComment *comment = doc.NewComment("this is a xml test file");
    doc.InsertEndChild(comment);

    tinyxml2::XMLElement *root = doc.NewElement("Root");
    doc.InsertEndChild(root);

    // User
    tinyxml2::XMLElement *user = doc.NewElement("User");
    user->SetAttribute("Name", "fengbingchun");
    root->InsertEndChild(user);

    tinyxml2::XMLElement *blog = doc.NewElement("Blog");
    tinyxml2::XMLText *text1 = doc.NewText("CSDN");
    blog->InsertEndChild(text1);
    user->InsertEndChild(blog);

    tinyxml2::XMLElement *code = doc.NewElement("Code");
    tinyxml2::XMLText *text2 = doc.NewText("GitHub");
    code->InsertEndChild(text2);
    user->InsertEndChild(code);

    // Blog
    tinyxml2::XMLElement *blog2 = doc.NewElement("Blog");
    blog2->SetAttribute("Name", "CSDN");
    root->InsertEndChild(blog2);

    tinyxml2::XMLElement *addr = doc.NewElement("Address");
    tinyxml2::XMLText *text3 = doc.NewText("https://blog.csdn.net/fengbingchun");
    addr->InsertEndChild(text3);
    blog2->InsertEndChild(addr);

    tinyxml2::XMLElement *id = doc.NewElement("ID");
    tinyxml2::XMLText *text4 = doc.NewText("fengbingchun");
    id->InsertEndChild(text4);
    blog2->InsertEndChild(id);

    // Code
    tinyxml2::XMLElement *code2 = doc.NewElement("Code");
    code2->SetAttribute("Name", "GitHub");
    root->InsertEndChild(code2);

    tinyxml2::XMLElement *addr2 = doc.NewElement("Address");
    tinyxml2::XMLText *text5 = doc.NewText("https://github.com//fengbingchun");
    addr2->InsertEndChild(text5);
    code2->InsertEndChild(addr2);

    tinyxml2::XMLElement *repositories = doc.NewElement("Repositories");
    tinyxml2::XMLText *text6 = doc.NewText("27");
    repositories->InsertEndChild(text6);
    code2->InsertEndChild(repositories);

#ifdef _MSC_VER
    const char *file_name = "E:/GitCode/Messy_Test/testdata/test.xml";
#else
    const char *file_name = "testdata/test.xml";
#endif

    ret = doc.SaveFile(file_name);
    if (ret != 0)
    {
        fprintf(stderr, "fail to save xml file: %s\n", file_name);
        return -1;
    }

    return 0;
}

结果:

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!--this is a xml test file-->
<Root>
    <User Name="fengbingchun">
        <Blog>CSDN</Blog>
        <Code>GitHub</Code>
    </User>
    <Blog Name="CSDN">
        <Address>https://blog.csdn.net/fengbingchun</Address>
        <ID>fengbingchun</ID>
    </Blog>
    <Code Name="GitHub">
        <Address>https://github.com//fengbingchun</Address>
        <Repositories>27</Repositories>
    </Code>
</Root>
3.解析XML文件
cpp 复制代码
int test_tinyxml2_parse()
{
#ifdef _MSC_VER
    const char *file_name = "E:/GitCode/Messy_Test/testdata/test_tinyxml2.xml";
#else
    const char *file_name = "testdata/test_tinyxml2.xml";
#endif

    tinyxml2::XMLDocument doc;
    tinyxml2::XMLError ret = doc.LoadFile(file_name);
    if (ret != 0)
    {
        fprintf(stderr, "fail to load xml file: %s\n", file_name);
        return -1;
    }

    tinyxml2::XMLElement *root = doc.RootElement();
    fprintf(stdout, "root element name: %s\n", root->Name());

    // User
    tinyxml2::XMLElement *user = root->FirstChildElement("User");
    if (!user)
    {
        fprintf(stderr, "no child element: User\n");
        return -1;
    }
    fprintf(stdout, "user name: %s\n", user->Attribute("Name"));

    tinyxml2::XMLElement *blog = user->FirstChildElement("Blog");
    if (!blog)
    {
        fprintf(stderr, "no child element: Blog, in User\n");
        return -1;
    }
    fprintf(stdout, "blog value: %s\n", blog->GetText());
    fprintf(stdout, "code value: %s\n\n", user->FirstChildElement("Code")->GetText());

    // Blog
    tinyxml2::XMLElement *blog2 = root->FirstChildElement("Blog");
    if (!blog2)
    {
        fprintf(stderr, "no child element: Blog\n");
        return -1;
    }
    fprintf(stdout, "blog name: %s\n", blog2->Attribute("Name"));

    tinyxml2::XMLElement *addr = blog2->FirstChildElement("Address");
    if (!addr)
    {
        fprintf(stderr, "no child element: Address, in Blog\n");
        return -1;
    }
    fprintf(stdout, "address value: %s\n", addr->GetText());
    fprintf(stdout, "id value: %s\n\n", blog2->FirstChildElement("ID")->GetText());

    // Code
    tinyxml2::XMLElement *code = root->FirstChildElement("Code");
    if (!code)
    {
        fprintf(stderr, "no child element: Code\n");
        return -1;
    }
    fprintf(stdout, "code name: %s\n", code->Attribute("Name"));

    tinyxml2::XMLElement *addr2 = code->FirstChildElement("Address");
    if (!addr2)
    {
        fprintf(stderr, "no child element: Address, in Code\n");
        return -1;
    }
    fprintf(stdout, "address value: %s\n", addr2->GetText());
    fprintf(stdout, "repositories value: %s\n\n", code->FirstChildElement("Repositories")->GetText());

    return 0;
}
相关推荐
Lhan.zzZ7 小时前
笔记_2026.4.28_004
c++·ide·笔记·qt
wuminyu9 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
万粉变现经纪人9 小时前
如何解决 pip install llama-cpp-python 报错 未安装 CMake/Ninja 或 CPU 不支持 AVX 问题
开发语言·python·开源·aigc·pip·ai写作·llama
木喃的井盖10 小时前
无锁队列细节
c++·工程
王老师青少年编程10 小时前
csp信奥赛C++高频考点专项训练之字符串 --【字符串基础】:输出亲朋字符串
c++·字符串·csp·高频考点·信奥赛·专项训练·输出亲朋字符串
挖AI金矿10 小时前
(十五)MCP协议与插件生态 — 扩展无限可能
开源·个人开发·ai编程·hermes agent·爱马仕agent
WBluuue11 小时前
数据结构与算法:莫队(一):普通莫队与带修莫队
c++·算法
KuaCpp11 小时前
C++面向对象(速过复习版)
开发语言·c++
智者知已应修善业14 小时前
【51单片机不用数组动态数码管显示字符和LED流水灯】2023-10-3
c++·经验分享·笔记·算法·51单片机
AI进化营-智能译站15 小时前
ROS2 C++开发系列16-智能指针管理传感器句柄|告别ROS2节点内存泄漏与野指针
java·c++·算法·ai