C++:使用tinyxml2获取节点下元素

news/2024/9/23 20:43:22/

场景

假设有以下 XML 文档:

<?xml version="1.0"?>
<Root><Kind>ExampleText</Kind>
</Root>

以下是如何使用这行代码来获取 <Kind> 元素的文本内容:

#include "tinyxml2.h"
#include <iostream>int main() {tinyxml2::XMLDocument doc;doc.LoadFile("example.xml");// 获取根元素tinyxml2::XMLElement* rootNode = doc.RootElement();// 检查 rootNode 是否为空if (!rootNode) {std::cerr << "Failed to load root element." << std::endl;return -1;}// 查找 "Kind" 子元素并获取其文本内容const char* kindText = rootNode->FirstChildElement("Kind")->GetText();// 检查 kindText 是否为空if (kindText) {std::cout << "Kind: " << kindText << std::endl;} else {std::cout << "Kind element not found or has no text." << std::endl;}return 0;
}

输出

Kind: ExampleText

rootNode->FirstChildElement("Kind")->GetText() 是使用 TinyXML-2 库从 XML 文档中提取特定元素文本内容的代码。这行代码的作用是:

  1. rootNode:这是一个指向 tinyxml2::XMLElement 类型的指针,表示当前的 XML 节点,通常是文档的根节点或某个元素节点。

  2. FirstChildElement("Kind"):在当前节点 rootNode 下,查找第一个名为 "Kind" 的子元素。如果找到,该函数返回一个指向该子元素的指针,否则返回 nullptr

  3. GetText():获取找到的 "Kind" 元素的文本内容,以 const char* 的形式返回。如果元素没有文本内容,返回 nullptr

详细解释

以下是对这行代码的逐步拆解和解释:

  1. 查找子元素

tinyxml2::XMLElement* kindElement = rootNode->FirstChildElement("Kind");
  • FirstChildElement("Kind"):在 rootNode 的子元素中查找第一个标签名为 "Kind" 的元素。
  • 返回值:如果找到,kindElement 是指向该元素的指针;如果未找到,kindElementnullptr

2.获取文本内容

const char* text = kindElement->GetText();
  • GetText():获取 kindElement 的文本内容。
  • 返回值:text 是一个 const char*,指向元素的文本内容。如果元素没有文本内容,返回 nullptr

3.完整代码

const char* text = rootNode->FirstChildElement("Kind")->GetText();

直接将查找和获取文本内容的操作连在一起。

注意事项

空指针检查:在实际使用中,最好对每个可能为空的指针进行检查,避免程序崩溃。例如:

tinyxml2::XMLElement* kindElement = rootNode->FirstChildElement("Kind");
if (kindElement) {const char* kindText = kindElement->GetText();if (kindText) {// 处理文本内容} else {// 处理文本内容为空的情况}
} else {// 处理未找到 "Kind" 元素的情况
}
  • 元素不存在:如果 "Kind" 元素不存在,FirstChildElement("Kind") 将返回 nullptr。直接对 nullptr 调用 GetText() 会导致未定义的行为,通常是程序崩溃。

  • 文本内容为空:如果 "Kind" 元素存在但没有文本内容,GetText() 将返回 nullptr

总结

rootNode->FirstChildElement("Kind")->GetText() 的作用是:

  • 查找:在 rootNode 下查找第一个名为 "Kind" 的子元素。
  • 获取文本:获取找到的 "Kind" 元素的文本内容。
  • 返回值:返回一个 const char*,指向文本内容。

这个操作通常用于从 XML 配置文件或数据文件中提取特定的信息,例如设置参数、配置信息等。

其他场景

遍历多个同名元素:如果有多个 <Kind> 元素,需要遍历所有同名元素:

for (tinyxml2::XMLElement* elem = rootNode->FirstChildElement("Kind");elem != nullptr;elem = elem->NextSiblingElement("Kind")) {const char* kindText = elem->GetText();if (kindText) {std::cout << "Kind: " << kindText << std::endl;}
}

处理嵌套元素:如果 "Kind" 元素嵌套在其他元素中,需要逐级查找:

tinyxml2::XMLElement* parent = rootNode->FirstChildElement("Parent");
if (parent) {tinyxml2::XMLElement* kindElement = parent->FirstChildElement("Kind");// ...后续操作
}


http://www.ppmy.cn/news/1529485.html

相关文章

深度学习速通系列:中文文本处理步骤

在深度学习中&#xff0c;中文文本处理通常涉及以下几个关键步骤&#xff1a; 分词&#xff1a;由于中文文本不像英文那样有明显的单词分隔符&#xff0c;因此需要通过分词工具&#xff08;如jieba&#xff09;将句子切分成单个词语。 去除停用词和特殊字符&#xff1a;清理文…

DevExpress中文教程:如何将WinForms数据网格连接到ASP. NET Core WebAPI服务?

日前DevExpress官方发布了DevExpress WinForms的后续版本——将.NET桌面客户端连接到安全后端Web API服务(EF Core with OData)&#xff0c;在本文中我们将进一步演示如何使用一个更简单的服务来设置DevExpress WinForms数据网格。 P.S&#xff1a;DevExpress WinForms拥有180…

远程文件管理及操作工具

项目背景 能够管理本地和远程文件&#xff08;例如通过网络共享路径&#xff09;并执行常见操作的工具。这些操作包括文件复制、剪切、删除等&#xff0c;且操作后能动态更新用户界面中显示的文件系统。项目中需要使用 QTreeView 作为文件浏览的界面&#xff0c;通过多线程处理…

Fyne ( go跨平台GUI )中文文档- 架构 (八)完结

本文档注意参考官网(developer.fyne.io/) 编写, 只保留基本用法 go代码展示为Go 1.16 及更高版本, ide为goland2021.2 这是一个系列文章&#xff1a; Fyne ( go跨平台GUI )中文文档-入门(一)-CSDN博客 Fyne ( go跨平台GUI )中文文档-Fyne总览(二)-CSDN博客 Fyne ( go跨平台GUI…

Java基础-零拷贝

文章目录 什么是零拷贝&#xff1f;传统IO执行过程零拷贝的意义零拷贝的主要实现方式实际应用场景零拷贝的优势零拷贝的局限性 Java 中的零拷贝实现FileChannel.transferTo()FileChannel.transferFrom() 相关知识点解释什么是DMA内核空间和用户空间什么是用户态、内核态什么是上…

jenkins 部署到tomcat

将 Jenkins 部署到 Tomcat 需要将 Jenkins 的 WAR 文件部署到 Tomcat 中。以下是详细步骤&#xff1a; 1. 准备环境 确保你已经安装了 Tomcat 并且 Tomcat 服务正在运行。你可以使用 apt-get 安装 Tomcat&#xff0c;如下所示&#xff08;以 Tomcat 9 为例&#xff09;&#…

在excel中使用python?

是的&#xff01;excel中可以使用python了&#xff01; 在去年8月22日&#xff0c;微软通过官方博客发布将与anaconda展开合作&#xff0c;简而言之就是excel将支持python&#xff0c;可以在表格中直接利用python就行数据分析&#xff0c;可以在表格中直接运行python了。 如何…

VulnHub-Bilu_b0x靶机笔记

Bilu_b0x 靶机 概述 Vulnhub 的一个靶机&#xff0c;包含了 sql 注入&#xff0c;文件包含&#xff0c;代码审计&#xff0c;内核提权。整体也是比较简单的内容&#xff0c;和大家一起学习 Billu_b0x.zip 靶机地址&#xff1a; https://pan.baidu.com/s/1VWazR7tpm2xJZIGUS…