有的xml文件中内容是按属性方式写入的,格式示例如下所示:

<?xml version="1.0" standalone="yes" encoding="utf-8"?>
<FileRoot><Attr1 ip="192.168.0.1" timeout="123.456000"/><Attr2 ip="192.168.0.1" timeout="123.456000"/><Attr_1Floor><Attr1 name="Attr1" x="5" y="15" w="400" h="250"/><Attr2 name="Attr2" x="5" y="15" w="400" h="250"/></Attr_1Floor>
</FileRoot>

针对这种格式的xml文件我们可以利用TiXmlAttribute属性进行遍历查找存储,具体实现细节如下:

1、首先我们针对Attr1属性里面的内容,我们可以采用_STL_1MAP_PARAM来存储,如下所示:

/*
<FileRoot><Attr1 ip="192.168.0.1" timeout="123.456000"/><Attr2 ip="192.168.0.1" timeout="123.456000"/>
</FileRoot>
*/
bool CTinyxmlEngine::Read_XML_1Floor_Attr(const char*pszPath,const char*pszNode,_STL_1MAP_PARAM&m_param)
{TiXmlDocument doc(pszPath);if (!doc.LoadFile()){return false;}const char*pszXmlName,*pszXmlValue;TiXmlElement* p_root = doc.RootElement();for (TiXmlNode*p_node = p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement()){pszXmlName=p_node->Value();if (strcmp(pszXmlName,pszNode)==0){TiXmlElement*p_element = p_node->ToElement();for (TiXmlAttribute*p_attribute = p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next()){pszXmlName = p_attribute->Name();pszXmlValue = p_attribute->Value();if (NULL!=pszXmlValue){m_param.v_param.push_back(pszXmlName);m_param.m_param.insert(map<string,string>::value_type(pszXmlName,pszXmlValue));}}break;}}return true;
}

同理,如果有多个类似Attr1的属性值存在的话,我们可以采用_STL_2MAP_PARAM参数进行存储,如下所示:

/*
<FileRoot><Attr1 ip="192.168.0.1" timeout="123.456000"/><Attr2 ip="192.168.0.1" timeout="123.456000"/>
</FileRoot>
*/
bool CTinyxmlEngine::Read_XML_2Floor_Attr(const char*pszPath,_STL_2MAP_PARAM&m_param)
{TiXmlDocument doc(pszPath);if (!doc.LoadFile()){return false;}const char*pszXmlName,*pszXmlValue,*pszXmlName1;_STL_1MAP_PARAM m_param1;TiXmlElement* p_root = doc.RootElement();for (TiXmlNode* p_node=p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement()){pszXmlName = p_node->Value();if (pszXmlName!=NULL){TiXmlElement* p_element = p_node->ToElement();m_param1.m_param.clear();m_param1.v_param.clear();for (TiXmlAttribute* p_attribute=p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next()){pszXmlName1 = p_attribute->Name();pszXmlValue = p_attribute->Value();if (pszXmlValue!=NULL){m_param1.v_param.push_back(pszXmlName1);m_param1.m_param.insert(make_pair(pszXmlName1,pszXmlValue));}}if (!m_param1.v_param.empty()){m_param.v_param.push_back(pszXmlName);m_param.m_param.insert(make_pair(pszXmlName,m_param1));}}}return true;
}

扩展:我们可以读取多个上述节点,根据需要的节点来获取属性值,比如我们需要获取Attr_1Floor属性值,如下所示:

/*
<FileRoot><Attr_1Floor><Attr1 name="Attr1" x="5" y="15" w="400" h="250"/><Attr2 name="Attr2" x="5" y="15" w="400" h="250"/></Attr_1Floor>
</FileRoot>
*/
bool CTinyxmlEngine::Read_XML_2Floor_Attr(const char*pszPath,const char*pszNode,_STL_2MAP_PARAM&m_param)
{TiXmlDocument doc(pszPath);if (!doc.LoadFile()){return false;}const char*pszXmlName,*pszXmlValue,*pszXmlName1;_STL_1MAP_PARAM m_param1;TiXmlElement* p_root = doc.RootElement();for (TiXmlNode*p_node = p_root->FirstChildElement();p_node;p_node=p_node->NextSiblingElement()){pszXmlName = p_node->Value();if (strcmp(pszXmlName,pszNode)==0){TiXmlElement*p_element = p_node->ToElement();for (TiXmlNode*p_node = p_element->FirstChildElement();p_node;p_node = p_node->NextSiblingElement()){pszXmlName=p_node->Value();TiXmlElement*p_element = p_node->ToElement();m_param1.m_param.clear();m_param1.v_param.clear();for (TiXmlAttribute*p_attribute = p_element->FirstAttribute();p_attribute;p_attribute=p_attribute->Next()){pszXmlName1 = p_attribute->Name();pszXmlValue = p_attribute->Value();if (NULL!=pszXmlValue){m_param1.v_param.push_back(pszXmlName1);m_param1.m_param.insert(map<string,string>::value_type(pszXmlName1,pszXmlValue));}}m_param.v_param.push_back(pszXmlName);m_param.m_param.insert(map<string,_STL_1MAP_PARAM>::value_type(pszXmlName,m_param1));}break;}}return true;
}

函数示例调用如下:

#include <iostream>
#include <string>
#include "TinyxmlEngine.h"
using namespace std;void Print_m_param1(_STL_1MAP_PARAM m_param1)
{vector<string>::iterator it = m_param1.v_param.begin();for (;it!=m_param1.v_param.end();++it){cout<<"   "<<*it<<": "<<m_param1.m_param[*it]<<endl;}cout<<"================================"<<endl;
}void Print_m_param2(_STL_2MAP_PARAM m_param2)
{vector<string>::iterator it = m_param2.v_param.begin();for (;it!=m_param2.v_param.end();++it){cout<<*it<<":"<<endl;_STL_1MAP_PARAM m_param1 = m_param2.m_param[*it];vector<string>::iterator it1 = m_param1.v_param.begin();for (;it1!=m_param1.v_param.end();++it1){cout<<"   "<<*it1<<": "<<m_param1.m_param[*it1]<<endl;}cout<<"================================"<<endl;}
}void Print_m_param3(_STL_3MAP_PARAM m_param3)
{vector<string>::iterator it = m_param3.v_param.begin();for (;it!=m_param3.v_param.end();++it){cout<<*it<<":"<<endl;_STL_2MAP_PARAM m_param2;m_param2 = m_param3.m_param[*it];vector<string>::iterator it = m_param2.v_param.begin();for (;it!=m_param2.v_param.end();++it){cout<<"   "<<*it<<":"<<endl;_STL_1MAP_PARAM m_param1 = m_param2.m_param[*it];vector<string>::iterator it1 = m_param1.v_param.begin();for (;it1!=m_param1.v_param.end();++it1){cout<<"      "<<*it1<<": "<<m_param1.m_param[*it1]<<endl;}}cout<<"================================"<<endl;}
}int main()
{CTinyxmlEngine m_engine;_STL_1MAP_PARAM  m_param1;m_engine.Read_XML_1Floor_Attr("Attr.xml","Attr1",m_param1);Print_m_param1(m_param1);_STL_2MAP_PARAM  m_param2;m_engine.Read_XML_2Floor_Attr("Attr.xml",m_param2);Print_m_param2(m_param2);m_engine.Erase_Param_2AMP(m_param2);m_engine.Read_XML_2Floor_Attr("Attr.xml","Attr_1Floor",m_param2);Print_m_param2(m_param2);return 0;
}

运行结果:

至此,根据Tinyxml读取xml的text内容及attribute属性操作都描述完成了,在实际的应用过程中,两种文本写入方式往往会结合使用,这就需要我们根据不同的场景需求进行相应的遍历读取,接下来讲讲文本及属性的xml写入

Tinyxml一一利用tinyxml读取节点元素属性值相关推荐

  1. JavaScript学习(八)—属性节点和属性值的操作

    JavaScript学习(八)-属性节点和属性值的操作 方式一: 利用元素节点的attributes属性来获取该元素身上所有的属性 格式1:元素节点.attributes 返回值:返回值为所有属性的节 ...

  2. 利用java反射机制修改属性值

    利用java反射机制修改属性值 本文将介绍如何利用java反射机制修改属性值,废话不多说,直接上代码 1.新建一个实体类,添加属性test以及获取属性值的方法getTest() public clas ...

  3. java dom获取命名空间属性_Java DOM XML解析::获取元素属性值

    如何从元素中提取属性值.我的xml节点是这样写的 &LT nodename attribute ="value">我需要将其解压缩以将其与另一个字符串进行比较. 但由 ...

  4. nodeType(节点类型) 属性值说明

    文章参考:http://www.maomao365.com/?p=15323 nodeType属性值是一个只读属性,返回一个数字,表示当前节点的类型. <ul id="containe ...

  5. java dom4 引入_java – 使用dom4j从节点获取属性值

    我的 XML结构类似于下面的示例.我正在尝试使用dom4j从XML中获取属性值. 目前,节点使用以下代码存储到List中: public List getFoo() { String FOO_XPAT ...

  6. GDAL C#读取shp中文属性值乱码问题

    GDAL的C#版本读取shp中,如果属性值中含有中文,读出来有可能是乱码的问题,根据SWIG生成的C#代码调试发现问题所在,在Ogr.cs文件中有这么一个函数,代码如下: internal stati ...

  7. SpringBoot+log4j2.xml读取application.yml属性值

    参考文章:SpringBoot+log4j2.xml使用application.yml属性值 1.创建Listener package com.cloud.config;import org.apac ...

  8. C++ AO读取shapefile的属性值

    C++ AO读取一个shapefile文件的所有属性值     #include "stdafx.h"     #include "iostream.h"   ...

  9. airtest-poco获取元素属性值attr

    poco有直接获取属性的接口get_text,get_name.有时我们想获取其他的属性值,这时就需要用到attr(),我用个实际的场景示范下,比如,我想获取qq头像框的visible属性值 代码: ...

最新文章

  1. MYsql 查询 查询当前月份的数据
  2. 桁架机器人运动视频_桁架机器人的直线定位单元
  3. mac phpstorm 2018 激活码
  4. CCPC-Wannafly Winter Camp Day8 (Div2, onsite) 补题
  5. 前端学习(2700):重读vue电商网站21之如何导入全局样式表
  6. html:(14):给div命名和table标签
  7. 运放放大倍数计算公式_19.运算放大器的特性与应用,不得不掌握的知识点(一)...
  8. linux ntp测试,linux 查看ntp服务器是否可访问
  9. realme进军中国 目标做行业主流手机品牌
  10. 【Shell系列】之shell脚本中常用句法
  11. oracle 11g函数包缓存,Oracle11新特性——PLSQL函数缓存结果(二)
  12. IT项目 软件研发最佳实践
  13. lol服务器维护2021,英雄联盟客户端清理:2021进度与后续计划
  14. android脚本,安卓好用的脚本程序—Gscript
  15. 解决:在ubuntu下安装R语言ks包时的error:configuration failed for package ‘rgl’
  16. Python基础学习之 import 用法详解
  17. nexus 4 android 5.0,真是亲儿子 Nexus 4可升安卓5.1
  18. 赣州php微信群,PHP微信群加群强制分享转发裂变源码
  19. 如何通过企业微信、飞书、钉钉消息通知接收双因子认证动态密码?
  20. 打印机 “错误-正在打印”

热门文章

  1. 三只松鼠股东大撤退幕后
  2. 计算机网络云怎么连接网络设置方法,华为云电脑如何连网,华为云电脑使用教程...
  3. 科技云报道:2022年,产业互联网如何重建安全边界?
  4. 吃糖果游戏(tyvj 1567)
  5. Python实例教程Mechanize模块编写爬虫的要点解析
  6. 【解决方案】VS2013外部工具中添加ildasm.exe
  7. 使用Xunit进行单元测试
  8. bilibili源码泄漏后,程序员们从代码里扒出来的彩蛋
  9. 洪柱森老师介绍--沪师经纪-刘建
  10. Change Log for Pruning Undesired Code of Joomsport