如何使用Tinyxml-2从XML指定元素与属性中获取文本?
解决TinyXML-2从指定属性的entry元素中获取文本的问题
看起来你已经完成了XML文件加载和根节点获取的基础步骤,问题出在后续如何定位到指定entry元素并提取文本的环节上。我来帮你完善代码,解决这个问题:
首先先明确你的XML结构:
AAA BBB
完整解决方案代码
这里提供两种常用的实现方式,你可以根据需求选择:
#include <tinyxml2.h> #include <iostream> #include <string> using namespace tinyxml2; bool readXMLContent() { XMLDocument xml_doc; // 加载XML文件 XMLError eResult = xml_doc.LoadFile("C:\\test.xml"); if (eResult != XML_SUCCESS) { std::cout << "加载XML文件失败: " << xml_doc.ErrorName() << std::endl; return false; } // 获取根节点properties(注意用XMLElement*更方便操作属性和文本) XMLElement* root = xml_doc.FirstChildElement("properties"); if (root == nullptr) { std::cout << "未找到根节点properties" << std::endl; return false; } // -------------------------- // 方式1:遍历所有entry元素,筛选指定key的内容 // -------------------------- XMLElement* entryElem = root->FirstChildElement("entry"); while (entryElem != nullptr) { // 获取entry的key属性值 const char* keyAttr = entryElem->Attribute("key"); if (keyAttr != nullptr) { // 获取元素内的文本内容 const char* textContent = entryElem->GetText(); // 输出所有key和对应值 std::cout << "Key: " << keyAttr << ", Value: " << (textContent ? textContent : "空内容") << std::endl; // 定位到你需要的NAME和SURNAME if (std::string(keyAttr) == "NAME") { std::string name(textContent ? textContent : ""); std::cout << "提取到NAME: " << name << std::endl; } if (std::string(keyAttr) == "SURNAME") { std::string surname(textContent ? textContent : ""); std::cout << "提取到SURNAME: " << surname << std::endl; } } // 移动到下一个entry元素 entryElem = entryElem->NextSiblingElement("entry"); } // -------------------------- // 方式2:用XPath直接定位指定key的entry(需要TinyXML-2版本支持XPath) // -------------------------- XMLElement* nameEntry = root->SelectSingleElement("entry[@key='NAME']"); if (nameEntry != nullptr) { const char* nameText = nameEntry->GetText(); if (nameText != nullptr) { std::cout << "直接定位到NAME: " << nameText << std::endl; } } return true; } int main() { readXMLContent(); return 0; }
关键注意点
使用
XMLElement*而非XMLNode*:FirstChildElement直接返回XMLElement*,它比XMLNode*多了操作属性和文本的方法(比如Attribute()、GetText()),不用额外转换更方便。空指针检查:
一定要检查Attribute()和GetText()的返回值是否为nullptr,避免空指针访问导致程序崩溃。遍历元素的正确方式:
用NextSiblingElement("entry")来遍历同层级的所有entry元素,确保不会跳过或错误遍历其他元素。XPath方式的兼容性:
如果使用SelectSingleElement的XPath语法,需要确认你的TinyXML-2版本支持XPath(较新的版本都支持,若版本过旧建议升级)。
内容的提问来源于stack exchange,提问作者Mesut KAYA
相关产品推荐
相关产品推荐

