GitHub地址:
在线文档:
TinyXML 是什么
tiny : 微小的
基础定义
TinyXML 是一套轻量级、开源、C++ 实现的 XML 解析库,专门用来读写 XML 文件。 特点:
- 纯 C++,不需要额外依赖;
- 体积小、编译简单,非常适合嵌入式、后台服务、工业软件(你现在代码里用的就是它);
- 只支持 XML DOM 模式(把整个 xml 加载到内存形成节点树);
- 有两个主流版本:
- TinyXML(旧版,
TiXmlDocument/TiXmlElement,你当前代码在用) - TinyXML-2(重写优化版,性能更好,API 略有区别,新项目推荐)
- TinyXML(旧版,
注意:不支持 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
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(另一种解析模型,经常拿来对比)
| 特性 | DOM | SAX |
|---|---|---|
| 工作方式 | 一次性载入内存生成树 | 逐行流式读取,不保存整棵树 |
| 访问方式 | 随机访问,任意跳转节点 | 只能顺序从头读到尾,不能回头 |
| 修改能力 | 支持增删改节点 | 只读,无法修改文档 |
| 内存开销 | 大(文件越大占用越高) | 极小 |
| 适用场景 | 中小型配置文件(你的 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 构建过程:
读取磁盘文件 → 分词解析 → 在内存生成完整节点树。
之后所有操作:
FirstChildElement、IterateChildren、Value()、GetText() 都是操作内存里的 DOM 树,和磁盘文件无关。
调用 docx.SaveFile() 才会把内存中的 DOM 树写回磁盘。
前面提到的 XPath,本质就是一套DOM 树上的检索语法。
没有 DOM 树,XPath 无法工作;
原版 TinyXML 只有 DOM 实现,但是没有内置 XPath 检索工具,只能手动循环遍历。

7252

被折叠的 条评论
为什么被折叠?



