TinyXML

GitHub地址:

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

在线文档:

TinyXML-2: TinyXML-2


TinyXML 是什么

tiny : 微小的

基础定义

TinyXML 是一套轻量级、开源、C++ 实现的 XML 解析库,专门用来读写 XML 文件。 特点:

  • 纯 C++,不需要额外依赖;
  • 体积小、编译简单,非常适合嵌入式、后台服务、工业软件(你现在代码里用的就是它);
  • 只支持 XML DOM 模式(把整个 xml 加载到内存形成节点树);
  • 有两个主流版本:
    • TinyXML(旧版,TiXmlDocument / TiXmlElement,你当前代码在用)
    • TinyXML-2(重写优化版,性能更好,API 略有区别,新项目推荐)

注意:不支持 XPath,复杂查找需要自己循环遍历节点(就是你代码里 IterateChildren 这种循环遍历方式)。


XPath 是什么

XPath = XML Path Language(XML 路径语言)

作用:在 XML 文档里,像文件路径一样快速定位节点

把 XML 想象成一棵树:

<root>
  <device>
    <name>Bpf01</name>
    <data>123456</data>
  </device>
  <device>
    <name>Bpf02</name>
    <data>789000</data>
  </device>
</root>

不用一层层循环遍历(就像你 TinyXML 里多层 while 循环),写一条路径字符串直接找到目标节点。

更便捷


DOM 模型

Document Object Model,文档对象模型

核心思想: 把一份 XML(HTML 同理)完整加载进内存,解析成一棵节点树,程序通过对象指针操作树上每一个节点。

TinyXML、TinyXML2、pugixml 默认都是 DOM 解析模式

pugixml:近些年非常火,性能极高,支持 XPath,很多新项目替代 tinyxml

pugixml.org - Home

zeux/pugixml: Light-weight, simple and fast XML parser for C++ with XPath support

XML → DOM 树 直观例子

原始 XML:

<root>
  <bpf>
    <name>test01</name>
    <data>123456</data>
  </bpf>
</root>

DOM 在内存里构建树形结构:

Document(TiXmlDocument 整个文档)
└── Element(root)
    └── Element(bpf)
        ├── Element(name) → 文本节点 "test01"
        └── Element(data) → 文本节点 "123456"

每种节点都对应 C++ 对象:

  • 文档节点:TiXmlDocument
  • 元素标签:TiXmlElement<xxx>
  • 文本:TiXmlText
  • 注释:TiXmlComment      

它们都继承自基类 TiXmlNode


DOM 的典型特点

随机访问

树建好之后,可以自由上下遍历、查找子节点、父节点、兄弟节点。 你代码里 IterateChildren 遍历兄弟节点,就是 DOM 典型操作。

可读可改

可以新增节点、修改标签文本、删除节点,最后重新保存到文件。

一次性加载全部内容到内存

整个 XML 全部载入内存再处理。 如果 XML 文件超级大(几十 MB、上百 MB),内存占用高。


DOM 对比 SAX(另一种解析模型,经常拿来对比)

特性DOMSAX
工作方式一次性载入内存生成树逐行流式读取,不保存整棵树
访问方式随机访问,任意跳转节点只能顺序从头读到尾,不能回头
修改能力支持增删改节点只读,无法修改文档
内存开销大(文件越大占用越高)极小
适用场景中小型配置文件(你的 bpf_config.xml 就属于这类)超大日志类 XML

你读取配置文件场景,DOM 是最优选择,不用考虑 SAX。


/*功能描述 : 读取bpf_config.xml配置文件信息接口.*/
bool CFrameworkConfig::readBpfConfigXml()
{
    TiXmlNode *terNo_node = NULL;
    TiXmlElement *terNo_element = NULL;
    bpfConfig bConfig;
    TiXmlDocument *docx = new TiXmlDocument("./config/bpf/bpf_config.xml");
    TiXmlElement *root;
    bool result = docx->LoadFile();
    if (!result)
    {
        delete docx;
        return false;
    }
    root = docx->FirstChildElement();
    TiXmlNode *privious = NULL;
    while (true)
    {
        terNo_node = root->IterateChildren(privious);
        if ((TiXmlElement *)terNo_node == NULL)
        {
            break;
        }
        //遍历第二层
        TiXmlNode *configOne_privious = NULL;
        while (true)
        {
            TiXmlNode *confLevTwo_node = terNo_node->IterateChildren(configOne_privious);
            if ((TiXmlElement *) confLevTwo_node == NULL)
            {
                break;
            }
            terNo_element = (TiXmlElement *)confLevTwo_node;
            bConfig.sHrbridName = terNo_element->Value();
            if (terNo_element->GetText() != NULL)
            {
                bConfig.sBpfData = terNo_element->GetText();
            }
            else
            {
                bConfig.sBpfData = "";
            }
            frameConfgiList.push_back(bConfig);
            configOne_privious = confLevTwo_node;
        }
        privious = terNo_node;
    }
    delete docx;
    return true;
}

TiXmlDocument docx("./bpf_config.xml");
docx.LoadFile();

LoadFile() 内部就是DOM 构建过程

读取磁盘文件 → 分词解析 → 在内存生成完整节点树。

之后所有操作:

FirstChildElementIterateChildrenValue()GetText() 都是操作内存里的 DOM 树,和磁盘文件无关。

调用 docx.SaveFile() 才会把内存中的 DOM 树写回磁盘。


前面提到的 XPath,本质就是一套DOM 树上的检索语法

没有 DOM 树,XPath 无法工作;

原版 TinyXML 只有 DOM 实现,但是没有内置 XPath 检索工具,只能手动循环遍历。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伸头看云朵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值