You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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;
}

关键注意点

  1. 使用XMLElement*而非XMLNode*:
    FirstChildElement直接返回XMLElement*,它比XMLNode*多了操作属性和文本的方法(比如Attribute()、GetText()),不用额外转换更方便。

  2. 空指针检查:
    一定要检查Attribute()和GetText()的返回值是否为nullptr,避免空指针访问导致程序崩溃。

  3. 遍历元素的正确方式:
    用NextSiblingElement("entry")来遍历同层级的所有entry元素,确保不会跳过或错误遍历其他元素。

  4. XPath方式的兼容性:
    如果使用SelectSingleElement的XPath语法,需要确认你的TinyXML-2版本支持XPath(较新的版本都支持,若版本过旧建议升级)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:28:10