如何使用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
相关产品推荐
相关产品推荐

