【XML】TinyXML 详解(二):接口详解

【C++】郭老二博文之:C++目录

1、XML测试文件(laoer.xml)

<?xml version="1.0" standalone="no" ?>
<!-- Hello World !-->
<root>
    <child name="childName" id="1">
        <c_child name="c_child1Name" id="1">Text</c_child>
        <c_child name="c_child2Name" id="2">Text</c_child>
        <c_child name="c_child3Name" id="3">Text</c_child>
	</child>
    <child name="childName" id="2">Text</child>
    <child name="childName" id="3">
        <c_child name="c_child1Name" id="1">Text</c_child>
        <c_child name="c_child2Name" id="2">Text</c_child>
        <c_child name="c_child3Name" id="3">Text</c_child>
        <c_child name="c_child4Name" id="4">Text</c_child>
        <c_child name="c_child5Name" id="5">Text</c_child>
        <c_child name="c_child6Name" id="6">Text</c_child>
	</child>
    <child1 name="child1Name" id="4">Text</child1>
    <child2 name="child1Name" id="5">Text</child1>
    <child3 name="child1Name" id="6">Text</child1>
</root>

2、读取文件并打印

加载xml文件:TiXmlDocument::LoadFile()
获取错误信息:TiXmlDocument::ErrorDesc()
打印XML内容:TiXmlDocument::Print( stdout )

#include <iostream>
#include <sstream>

#include "tinyxml.h"

using namespace std;

int main()
{
    TiXmlDocument doc( "laoer.xml" );
    bool loadOkay = doc.LoadFile();

    if ( !loadOkay )
    {
        printf( "Could not load file 'gw.xml'. Error='%s'. Exiting.\n", doc.ErrorDesc() );
        exit( 1 );
    }

    doc.Print( stdout );
}

4、属性相关接口

4.1 获取属性

获取属性有四类接口

  • Attribute :获取属性,如果返回空,则表示不存在
  • QueryStringAttribute:获取属性,返回值“错误检查”值
  • C++ STL(使用std::string)
  • C++模版接口

1)Attribute 原型如:

const char* Attribute( const char* name ) const;
const char* Attribute( const char* name, int* i ) const;
const char* Attribute( const char* name, double* d ) const;
……

2)QueryStringAttribute 原型如:

int QueryIntAttribute( const char* name, int* _value ) const;
int QueryDoubleAttribute( const char* name, double* _value ) const;
……

3)C++ STL(使用std::string) 原型如:

const std::string* Attribute( const std::string& name ) const;
const std::string* Attribute( const std::string& name, int* i ) const;
const std::string* Attribute( const std::string& name, double* d ) const;

int QueryIntAttribute( const std::string& name, int* _value ) const;
int QueryDoubleAttribute( const std::string& name, double* _value ) const;
……

4)C++模版接口 原型如:

template< typename T > int QueryValueAttribute( const std::string& name, T* outValue ) const

4.2 设置属性

1)SetAttribute 原型如:

void SetAttribute( const char* name, const char * _value );
void SetAttribute( const char * name, int value );

2)SetDoubleAttribute 原型如:
void SetDoubleAttribute( const char * name, double value );

3)C++STL(使用std::string) 原型如:

void SetAttribute( const std::string& name, const std::string& _value );
void SetAttribute( const std::string& name, int _value );
void SetDoubleAttribute( const std::string& name, double value );
void printNameID(const TiXmlElement * const element)
{
    std::string name;
    if (element->QueryStringAttribute( "name", &name ) != TIXML_SUCCESS)
    {
        std::cout << "[ERR] QueryStringAttribute " << std::endl;
    }

    int id = -1;
    if (!element->Attribute("id", (int*)&id))
    {
        std::cout << "[ERR] Attribute(id " << std::endl;
    }

    std::cout << "name = " << name <<"; id = " <<id << std::endl;
}

4.3 删除属性

void RemoveAttribute( const char * name );
void RemoveAttribute( const std::string& name )

5、遍历子元素

1)返回第一个子元素:TiXmlElement* TiXmlNode::FirstChildElement()
2)返回第一个匹配“value”的子元素:TiXmlElement* TiXmlElement* FirstChildElement( const std::string& _value )
3)返回下一个兄弟元素:TiXmlElement* NextSiblingElement()
4)返回下一个匹配“value”的兄弟元素:TiXmlElement* NextSiblingElement( const std::string& _value)

#include <iostream>
#include <sstream>

#include "tinyxml.h"

using namespace std;

int main()
{
    TiXmlDocument doc( "laoer.xml" );
    TiXmlNode* rootNode = 0;
    TiXmlElement* rootElement = 0;
    
    rootNode = doc.FirstChild( "root" );
    rootElement = rootNode->ToElement();
    
    for( childElement = rootElement->FirstChildElement("child");
         childElement;
         childElement = childElement->NextSiblingElement("child") )
    {
        printNameID(childElement);
    }
}

6、TiXmlHandle 类

6.1 检查空指针

TiXmlHandle主要用来检测空节点指针(null)的类。
注意:TiXmlHandle 不是DOM 元素树的一部分,类关系如下
在这里插入图片描述

例如,遍历如下XML文档:

<Document>
	<Element attributeA = "valueA">
		<Child attributeB = "value1" />
		<Child attributeB = "value2" />
	</Element>
<Document>

TiXmlElement每次获取子元素后,都需要检查是否为NULL,否则操作NULL空指针将会报错

TiXmlElement* root = document.FirstChildElement( "Document" );
if ( root )
{
	TiXmlElement* element = root->FirstChildElement( "Element" );
	if ( element )
	{
		TiXmlElement* child = element->FirstChildElement( "Child" );
		if ( child )
		{
			TiXmlElement* child2 = child->NextSiblingElement( "Child" );
			if ( child2 )
			{
				// Finally do something useful.

使用 TiXmlHandle 可以简化上面的操作

TiXmlHandle docHandle( &document );
TiXmlElement* child2 = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", 1 ).ToElement();
if ( child2 )
{
	// do something useful

6.2 遍历元素

下面使用while循环遍历元素,看上去很合理,其实Child方法内部是一个线性遍历来查找元素,即下面的示例是两个嵌入的while循环

int i=0; 
while ( true ){
	TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).Child( "Child", i ).ToElement();
	if ( !child )
		break;
		// do something
		++i;
	}

代替方法:

TiXmlElement* child = docHandle.FirstChild( "Document" ).FirstChild( "Element" ).FirstChild( "Child" ).ToElement();

for( child; child; child=child->NextSiblingElement("Child") )
{
	// do something
}

注意上面 NextSiblingElement(“Child”) 和 NextSiblingElement()的区别

6.3 常用接口

TiXmlHandle FirstChild() const;//返回第一个子节点的句柄:
TiXmlHandle FirstChild( const std::string& _value ) const; //返回给定名称的第一个子节点的句柄。
TiXmlHandle FirstChildElement() const;//返回第一个子元素的句柄。
TiXmlHandle FirstChildElement( const std::string& _value ) const;//返回给定名称的第一个子元素的句柄。
TiXmlHandle Child( int index ) const;//返回指定索引“index”子节点的句柄。
TiXmlHandle Child( const std::string& _value, int index ) const;//返回给定名称指定索引“index”子节点的句柄。
TiXmlHandle ChildElement( int index ) const;//返回指定索引“index”子元素的句柄。
TiXmlHandle ChildElement( const std::string& _value, int index ) const//返回给定名称指定索引“index”子元素的句柄。

获取节点、元素、文本、未知元素的接口
TiXmlNode* ToNode() const
TiXmlElement* ToElement() const
TiXmlText* ToText() const
TiXmlUnknown* ToUnknown() const

7、创建XML

1)TiXmlNode* InsertEndChild( const TiXmlNode& addThis );
在“最后子节点”后添加新节点。如果发生错误则返回NULL。(addThis)是const引用,在内部会被复制addThis.Clone()

2)TiXmlNode* LinkEndChild( TiXmlNode* addThis );
在“最后子节点”后添加新节点,这里addThis 是指针,将被作为链表的一个项,插入到链表中,因此它内存管理将有父节点TiXmlNode接管。

3)TiXmlNode* InsertBeforeChild( TiXmlNode* beforeThis, const TiXmlNode& addThis );
在指定子节点之前添加子节点。

4)TiXmlNode* InsertAfterChild( TiXmlNode* afterThis, const TiXmlNode& addThis );
在指定的子元素之后添加子元素。

5)TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );
替换指定的节点

6)bool RemoveChild( TiXmlNode* removeThis );
删除指定的节点

#include <iostream>
#include <sstream>

#include "tinyxml.h"

using namespace std;

int main()
{
    TiXmlDocument doc( "laoer.xml" );
    TiXmlNode* rootNode = 0;
    TiXmlElement* rootElement = 0;

	// 创建新节点 "child3"
    TiXmlElement child( "child3" );
    child.SetAttribute( "name", "child3" );
    child.SetAttribute( "id", "8" );
	
	// 创建节点文本
    TiXmlText text( "text" );
	
	// 创建孙子节点1
    TiXmlElement c_child1( "c_child" );
    c_child1.SetAttribute( "name", "c_child1" );
    c_child1.SetAttribute( "id", "1" );
	
	// 创建孙子节点2
    TiXmlElement c_child2( "c_child" );
    c_child2.SetAttribute( "name", "c_child2" );
    c_child2.SetAttribute( "id", "2" );
	
	// 组装子节点
    child.InsertEndChild( text );
    child.InsertEndChild( c_child1 );
    child.InsertEndChild( c_child2 );
	
	// 获取插入点位置,将新节点插入到指定位置
    childElement = rootElement->FirstChildElement("child2");
    rootElement->InsertAfterChild( childElement, child );
    
    doc.Print( stdout );
    doc.SaveFile();
}

修改后的XML如下,请自行和博文开头的做对比

<?xml version="1.0" standalone="no" ?>
<!-- Hello World !-->
<root>
    <child name="childName" id="1">
        <c_child name="c_child1Name" id="1">Text</c_child>
        <c_child name="c_child2Name" id="2">Text</c_child>
        <c_child name="c_child3Name" id="3">Text</c_child>
    </child>
    <child name="childName" id="2">Text</child>
    <child name="childName" id="3">
        <c_child name="c_child1Name" id="1">Text</c_child>
        <c_child name="c_child2Name" id="2">Text</c_child>
        <c_child name="c_child3Name" id="3">Text</c_child>
        <c_child name="c_child4Name" id="4">Text</c_child>
        <c_child name="c_child5Name" id="5">Text</c_child>
        <c_child name="c_child6Name" id="6">Text</c_child>
    </child>
    <child1 name="child1Name" id="4">Text</child1>
    <child2 name="child1Name" id="5">Text</child2>
    <child3 name="child3" id="8">text
        <c_child name="c_child1" id="1" />
        <c_child name="c_child2" id="2" />
    </child3>
    <child3 name="child1Name" id="6">Text</child3>
</root>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/266533.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity手机移动设备重力感应

Unity手机移动设备重力感应 一、引入二、介绍三、测试成果X Y轴Z轴横屏的手机&#xff0c;如下图竖屏的手机&#xff0c;如下图 一、引入 大家对重力感应应该都不陌生&#xff0c;之前玩过的王者荣耀的资源更新界面就是使用了重力感应的概念&#xff0c;根据手机的晃动来给实体…

无需改动现有网络,企业高速远程访问内网Linux服务器

某企业为数据治理工具盒厂商&#xff0c;帮助客户摆脱数据问题困扰、轻松使用数据&#xff0c;使得客户可以把更多精力投入至数据应用及业务赋能&#xff0c;让数据充分发挥其作为生产要素的作用。 目前&#xff0c;该企业在北京、南京、西安、武汉等地均设有产研中心&#xff…

体验一下 CodeGPT 插件

体验一下 CodeGPT 插件 0. 背景1. CodeGPT 插件安装2. CodeGPT 插件基本配置3. (可选)CodeGPT 插件预制提示词原始配置(英文)4. CodeGPT 插件预制提示词配置(中文)5. 简单验证一下 0. 背景 看到B站Up主 “wwwzhouhui” 一个关于 CodeGPT 的视频&#xff0c;感觉挺有意思&#…

DQL-基本查询

概念&#xff1a; 1&#xff0c;数据库管理系统一个重要功能就是数据查询&#xff0c;数据查询不应只是简单返回数据库中存储的数据&#xff0c;还应该根据需要对数据进行筛选以及确定数据以什么样的格式显示 2&#xff0c;MySQL提供了功能强大、灵活的语句来实现这些操作 3…

docker笔记1-安装与基础命令

docker的用途&#xff1a; 可以把应用程序代码及运行依赖环境打包成镜像&#xff0c;作为交付介质&#xff0c;在各种环境部署。可以将镜像&#xff08;image&#xff09;启动成容器&#xff08;container&#xff09;&#xff0c;并提供多容器的生命周期进行管理&#xff08;…

Dash中 callback 5

app.callback 在Dash中&#xff0c;app.callback 被用于创建交互性应用程序&#xff0c;它用于定义一个回调函数&#xff0c;该函数在应用程序中发生特定事件时被触发。回调函数可以修改应用程序的布局或更新图表等内容&#xff0c;从而实现动态交互。 下面是一个简单的 app.…

BUG记录 | 使用阿里云OSS实现文件上传后,得到的url无法在浏览器中打开

项目背景 SpringBoot的项目&#xff0c;使用阿里云对象存储OSS对项目中的文件进行存储&#xff0c;所需文件也会通过IDEA中由官方Demo改编而成的工具类作为接口&#xff0c;调用接口后上传 问题描述 使用阿里云OSS实现文件上传后&#xff0c;通过postman测试得到的url无法在…

Python量化投资——金融数据最佳实践: 使用qteasy+tushare搭建本地金融数据仓库并定期批量更新【附源码】

用qteasytushare实现金融数据本地化存储及访问 目的什么是qteasy什么是tushare为什么要本地化使用qteasy创建本地数据仓库qteasy支持的几种本地化仓库类型配置本地数据仓库配置tushare 的API token 配置本地数据源 —— 用MySQL数据库作为本地数据源下载金融历史数据 数据的定期…

SQL分类

SQL分类 DDL 查询库 查询表 创建表 修改表 DML 添加数据 修改数据 删除数据 DQL 基本查询 条件查询 聚合函数 分组查询 排序查询 分页查询 执行顺序 DCL 管理用户 管理权限 数据类型 数值类型 字符串类型 日期类型

Go自定义PriorityQueue优先队列使用Heap堆

题目 分析 每次找最大的&#xff0c;pop出来 然后折半&#xff0c;再丢进去 go写法 go如果想用heap&#xff0c;要实现less\len\swap\push\pop 但可以偷懒&#xff0c;用sort.IntSlice,已经实现了less\len\swap 但由于目前是大根堆&#xff0c;要重写一下less 因此&#xff…

讲座思考 | 周志华教授:新型机器学习神经元模型的探索

12月22日&#xff0c;有幸听了南京大学周志华教授题为“新型机器学习神经元模型的探索”的讲座。现场热闹非凡&#xff0c;大家像追星一样拿着“西瓜书”找周教授签名。周教授讲得依旧循循善诱&#xff0c;由浅入深&#xff0c;听得我很入迷&#xff0c;故作此记。 周教授首先就…

Python 运算符 算数运算符 关系运算符 赋值运算符 逻辑运算 (逻辑运算符的优先级) 位运算 成员运算符 身份运算符 运算符的优先级

1 运算符算数运算符关系运算符赋值运算符逻辑运算逻辑运算符的优先级 位运算布尔运算符移位运算符 成员运算符身份运算符运算符的优先级 运算符 算数运算符 四则运算 - * / a 8 b 9 print(ab)#与Java类似 也可以进行字符串的连接 注意:字符串数字字符串 不存在会抛出异常…

Featured Based知识蒸馏及代码(3): Focal and Global Knowledge (FGD)

文章目录 1. 摘要2. Focal and Global 蒸馏的原理2.1 常规的feature based蒸馏算法2.2 Focal Distillation2.3 Global Distillation2.4 total loss3. 实验完整代码论文: htt

实战经验分享:开发同城外卖跑腿小程序

下文&#xff0c;小编将与大家一同探究同城外卖跑腿小程序的开发实战&#xff0c;包括但不限于技术选型、开发流程、用户体验等多个方面。 1.技术选型 在同城外卖跑腿小程序的开发中&#xff0c;技术选型是至关重要的一环。对于前端&#xff0c;选择了使用Vue.js框架&#xff…

Python电能质量扰动信号分类(二)基于CNN模型的一维信号分类

目录 前言 1 电能质量数据集制作与加载 1.1 导入数据 1.2 制作数据集 2 CNN-2D分类模型和训练、评估 2.1 定义CNN-2d分类模型 2.2 定义模型参数 2.3 模型结构 2.4 模型训练 2.5 模型评估 3 CNN-1D分类模型和训练、评估 3.1 定义CNN-1d分类模型 3.2 定义模型参数 …

论文阅读——BLIP-2

BLIP-2: Bootstrapping Language-Image Pre-training with Frozen Image Encoders and Large Language Models 1 模型 在预训练视觉模型和预训练大语言模型中间架起了一座桥梁。两阶段训练&#xff0c;视觉文本表示和视觉到语言生成学习。 Q-Former由两个转换器子模块组成&am…

六大开源 OA 办公系统

OA,即Office Automation的缩写&#xff0c;意思是办公自动化、协同办公。在现代办公环境中&#xff0c;办公自动化已经成为了必不可少的一部分&#xff0c;它可以代替办公人员传统的手动部分或重复性业务活动&#xff0c;优质而高效地处理办公事务和业务信息&#xff0c;实现对…

Openwrt AP 发射 WiFi 信号

问题 想一次把 OpenWrt 路由器 wifi 问题给解决&#xff0c;完全取代路由器。 使用 倍控的 N5105 设备&#xff0c;有 mPCIe 接口&#xff0c;使用了 intel AX200 无线网卡&#xff0c;支持 2.4G 与 5G。 设置步骤 OpenWrt 镜像 第一次使用的镜像不支持 wifi&#xff0c;在…

模式识别与机器学习(八):决策树

1.原理 决策树&#xff08;Decision Tree&#xff09;&#xff0c;它是一种以树形数据结构来展示决策规则和分类结果的模型&#xff0c;作为一种归纳学习算法&#xff0c;其重点是将看似无序、杂乱的已知数据&#xff0c;通过某种技术手段将它们转化成可以预测未知数据的树状模…

论文笔记--Learning Political Polarization on Social Media Using Neural Networks

论文笔记--Learning Political Polarization on Social Media Using Neural Networks 1. 文章简介2. 文章概括3. 相关工作4. 文章重点技术4.1 Collection of posts4.1.1 数据下载4.1.2 数据预处理4.1.3 统计显著性分析 4.2 Classification of Posts4.3 Polarization of users 5…