You need to enable JavaScript to run this app. 如何使用tinyxml2在XML树中查询包含指定子节点的元素
优惠活动
大模型
产品
解决方案
定价
更多

如何使用tinyxml2在XML树中查询包含指定子节点的元素

用TinyXML2筛选包含子元素<c>的<b>节点实现方案

TinyXML2原生未内置XPath解析能力,要实现类似XPath /a/b[c](匹配有直接子元素c的b节点)的查询效果,可通过手动遍历节点实现,以下是完整方案:

参考XML结构

<a>
    <b name = "b1"></b>
    <b name = "b2">
        <c/>
    </b>
    <b name = "b3"></b>
</a>

实现代码(C++)

#include "tinyxml2.h"
#include <iostream>

using namespace tinyxml2;

int main() {
    XMLDocument doc;
    // 加载XML文件,若要直接解析XML字符串可替换为doc.Parse("XML字符串内容")
    XMLError err = doc.LoadFile("test.xml");
    if (err != XML_SUCCESS) {
        std::cout << "XML解析失败,错误码:" << err << std::endl;
        return -1;
    }

    // 获取根节点a
    XMLElement* root = doc.FirstChildElement("a");
    if (!root) {
        std::cout << "未找到根节点a" << std::endl;
        return -1;
    }

    // 遍历根节点下所有b子节点
    XMLElement* b_node = root->FirstChildElement("b");
    while (b_node) {
        // 判断当前b节点是否存在直接子节点c
        if (b_node->FirstChildElement("c") != nullptr) {
            // 匹配到目标节点,可在此处添加业务逻辑,示例为打印name属性
            const char* name = b_node->Attribute("name");
            if (name) {
                std::cout << "匹配到符合要求的b节点,name属性:" << name << std::endl;
            }
        }
        // 移动到下一个b节点
        b_node = b_node->NextSiblingElement("b");
    }

    return 0;
}

输出结果

匹配到符合要求的b节点,name属性:b2

补充说明

  • 若需要筛选所有后代节点包含c的b节点(不限于直接子节点),可将判断逻辑替换为递归遍历b节点的所有子节点查询是否存在c元素即可。
  • 若要匹配整个XML树中所有层级包含c的b节点,可先递归遍历整个XML树获取所有b节点,再按上述规则筛选即可。

内容的提问来源于stack exchange,提问作者alooparantha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 15:57:01