1、认识

在使用之前,先大致了解一下TinyXml2结构,只有清楚地知道这些类都指什么内容,那么在解析任何xml时,都可以很好利用TinyXml2中提供的API。

比如如下的xml:

<?xml version="1.0" encoding="UTF-8"?>
<phonebook>
   <!--one item behalfs one contacted person.-->
   <item>
     <name>sister</name>
     <addr>Shaanxi Xi'an</addr>
     <tel>13759911917</tel>
     <email>miaomiao@home.com</email>
   </item>
   <item>
     <name>xiaoming</name>
     <addr>Liaoning Shenyang</addr>
     <tel>15840330481</tel>
     <email>xiaoming@qq.com</email>
   </item>
   <!--more contacted persons.-->
</phonebook>

结点说明:

TiXmlDeclaration 指的是<?xml version=”1.0″ encoding=”UTF-8″?>,

TiXmlComment 指的是<!–one item behalfs one contacted person.–>、 <!–more contacted persons.–>,

TiXmlDocument 指的是整个xml文档,

TiXmlElement 指的是<phonebook>、<item>、<name>、<addr>等等这些节点,

TiXmlText 指的是‘gougou’、‘15840330481’这些夹在<item>与</item>、<name>与</name>、<addr>与</addr>之间的文本文字,

TiXmlAttribute 指的是<?xml version=”1.0″ encoding=”UTF-8″?>节点中version、encoding,

除此之外就是 TiXmlUnknown。

2、使用

(1)最简单使用

/*
//xml格式:
<ResponseStatus version=“1.0” xmlns=”urn:skylight”><statusCode>XXX</statusCode><statusString>XXX</statusString>
</ResponseStatus>
*/do
{const char * lpXmlData = response_data;    //需要解析的数据bufferint32_t      llXmlSize = response_data_size;  //需要解析的sizeXMLProtocal       xml;int avx_success = xml.Open(lpXmlData, llXmlSize);if (avx_success == 0){printf("open fail!\n");break;}XMLElement * ResponseStatus = xml.RootElement();if (ResponseStatus == NULL){break;}int stateCode = -1;XMLElement* statusCode = ResponseStatus->FirstChildElement("statusCode");if (statusCode == NULL ||  == NULL){//...;}else{stateCode = atoi(statusCode->GetText());}XMLElement* statusString = ResponseStatus->FirstChildElement("statusString");if (statusString == NULL || statusString->GetText() == NULL){//...;}else{//使用 statusString->GetText()  }} while (0);

(2)使用XmlDocument ,纯xml文件

/*
xml格式:
*/
/*<tcphost>xxx</tcphost><tcpport>xxx</tcpport><udphost>xxx</udphost><udppost>xxx</udpport>
*/
do
{const char * lpXmlData = data;int32_t      llXmlSize = data_size;XMLProtocal       xmlen;int avx_success = xmlen.Open(lpXmlData, llXmlSize);if (avx_success == 0){printf("open fail!\n");break;}XMLDocument * doc;doc = xmlen.GetDocument();const char* TcpHost = doc->FirstChildElement("tcphost")->GetText();const char* TcpPort = doc->FirstChildElement("tcpport")->GetText();const char* UdpHost = doc->FirstChildElement("udphost")->GetText();const char* UdpPort = doc->FirstChildElement("udpport")->GetText();if (TcpHost){}if (TcpPort){}if (UdpHost){}if (UdpPort){}
} while (0);

(3)多级多层解析

/*
xml格式:
<homeInfo version = "1.0" xmlns = "urn:skylight">
<deviceList>
<device>
<deviceId>XXX<deviceId>
<deviceType>XXX</Type>
<deviceModel>XXX</deviceModel>
<deviceName>XXX</deviceName>
<deviceStatus>XXX</deviceStatus>
<button>
<buttonName> XXX </buttonName>
<buttonStatus> XXX </buttonStatus>
<leftButton> XXX </leftButton>
<leftStatus> XXX </leftStatus>
<rightButton> XXX </rightButton>
<rightStatus> XXX </rightStatus>
</button>
</device>
... ...
</deviceList>
<ResponseStatus>
<statusCode>XXX</statusCode>
<statusString>XXX</statusString>
</ResponseStatus>
</homeInfo>*/
//解析xml
do
{const char * lpXmlData = data;int32_t      llXmlSize = data_size;XMLProtocal       xml;int avx_success = xml.Open(lpXmlData, llXmlSize);if (avx_success == 0){printf("open fail!\n");break;}XMLElement * homeInfo = xml.RootElement();if (homeInfo == NULL){break;}int state = -1;XMLElement* ResponseStatus = homeInfo->FirstChildElement("ResponseStatus");if (ResponseStatus){XMLElement* statusCode = ResponseStatus->FirstChildElement("statusCode");if (statusCode == NULL || statusCode->GetText() == NULL){}else{state = atoi(statusCode->GetText());}XMLElement* statusString = ResponseStatus->FirstChildElement("statusString");if (statusString == NULL || statusString->GetText() == NULL){}else{}}if (state == 0)  //正确响应{XMLElement* deviceList = homeInfo->FirstChildElement("deviceList");if (deviceList == NULL) break;XMLNode* device = deviceList->FirstChild();while (device){XMLElement* deviceId = device->FirstChildElement("deviceId");if (deviceId && deviceId->GetText()){}XMLElement* deviceType = device->FirstChildElement("deviceType");if (deviceType && deviceType->GetText()){}XMLElement* deviceModel = device->FirstChildElement("deviceModel");if (deviceModel && deviceModel->GetText()){}XMLElement* deviceName = device->FirstChildElement("deviceName");if (deviceName && deviceName->GetText()){}XMLElement* deviceStatus = device->FirstChildElement("deviceStatus");if (deviceStatus && deviceStatus->GetText()){}/*button*/XMLElement* button = device->FirstChildElement("button");if (button){XMLElement* buttonName = button->FirstChildElement("buttonName");if (buttonName && buttonName->GetText()){}XMLElement* buttonStatus = button->FirstChildElement("buttonStatus");if (buttonStatus && buttonStatus->GetText()){}XMLElement* leftButton = button->FirstChildElement("leftButton");if (leftButton && leftButton->GetText()){}XMLElement* leftStatus = button->FirstChildElement("leftStatus");if (leftStatus && leftStatus->GetText()){}XMLElement* rightButton = button->FirstChildElement("rightButton");if (rightButton && rightButton->GetText()){}XMLElement* rightStatus = button->FirstChildElement("rightStatus");if (rightStatus && rightStatus->GetText()){}}device = device->NextSibling();}}
} while (0);
/*
<shareList>
<shareId>12345y</shareId>
<shareId>12345u</shareId>
<shareId>12345v</shareId>
</shareList>
*/XMLElement * shareList = queryShareRemain->FirstChildElement("shareList");
if (shareList == NULL) return false;XMLNode * shareId = shareList->FirstChildElement();
int i = 0;
while (shareId)
{XMLElement * shareIdElement = shareId->ToElement();if (shareIdElement && shareIdElement->GetText()){lpShareRemain->kSharedFileList.push_back(shareIdElement->GetText());}     shareId = shareId->NextSiblingElement();
}

TinyXml2解析xml用法例子相关推荐

  1. TinyXML-2解析XML数据

    声明 本文例子源自在C++中使用TinyXML2解析xml一文,其余部分来源于网络搜集,难免疏漏,敬请随意吐槽. XML以及JSON 什么是XML 根据Wikipedia-XML的说法: 可扩展标记语 ...

  2. C++ 本地使用tinyxml2解析Xml文件

    1.基本介绍 TinyXML2是一个开源.简单.小巧.高效的C++ XML解析器,它只有一个.h文件和一个.cpp文件组成,可以轻松集成到其它程序中.非常方便我们使用c++对xml进行处理. 可以读取 ...

  3. 《转》 在C++中使用TinyXML2解析xml

    读取和设置xml配置文件是最经常使用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,由于它的API接口和Java的十分类似.面向对象性非常好.       TinyX ...

  4. C++使用TinyXml2解析Xml

    1. TinyXml2 简介 TinyXml 一直是一个非常好用的 Xml 解析工具 , 最新的开源版本 TinyXml2 相对于旧版本的 TinyXml 使用更少的内存 , 更快 , 并且使用更少的 ...

  5. c++ tinyxml2 解析xml小坑

    如题,项目中遇到的解析xml小坑: xml是python在windows下生成的,虽然是utf8的,但是回车是16进制显示的0D 0A,与linux下的回车不同(0A),导致使用Parse函数时解析失 ...

  6. tinyxml2解析XML文件

    tinyxml2::XMLDocument xmlDoc;tinyxml2::XMLError error = xmlDoc.LoadFile(cfgFile.c_str());if (error ! ...

  7. Dom4j遍历解析XML测试

    http://lavasoft.blog.51cto.com/62575/66953 Dom4j遍历解析XML测试 近来老和XML打交道,不深挖不行了.. 这是一个Dom4j解析XML的例子,为做复杂 ...

  8. php dom xml解析,PHP使用DOM解析XML

    xml是一种严格的文档格式,有其自身的标准,解析xml,也有其标准,叫DOM标准.所有的xml.html都遵循DOM标准. 无论php,java,c,js,解析DOM树都遵循同样的DOM标准. 使用p ...

  9. C++调用tinyxml2读写xml

    C++调用tinyxml2读写xml 本例子一共只需要3个文件 获取所有代码请到github下载地址: 哔哩哔哩有详细的视频讲解地址: main.cpp tinyxml2.h tinyxml2.cpp ...

最新文章

  1. Dynamics Ax 2012 – AIF Import CSV File
  2. JAVA服务器搭建之问题总结
  3. struts解决form提交的中文参数乱码问题
  4. NPV Formula in Excel
  5. mysql数据库入门教程(9):数据的常见约束
  6. Doing Homework HDU - 1074
  7. Azkaban简介及安装教程
  8. 稳态可压Navier-Stokes方程组在修正Dirichlet边界下的解的存在性
  9. Jenkins部署java项目实例
  10. 【土壤分类】基于支持向量机实现土壤分类附matlab代码
  11. 触目惊心的互联网流量劫持
  12. python各类地图绘制
  13. Copy and Paste GAN: Face Hallucination from Shaded Thumbnails
  14. 这六大要素教会你挑选合适的酒店管理系统
  15. 用户头像的背景为头像的模糊头像时候
  16. pci 中断冲突_如何解决IRQ冲突
  17. 机器学习Python学习——逻辑斯蒂回归(Logistic Regression)
  18. ssm毕设项目康健医药公司进销存管理22jao(java+VUE+Mybatis+Maven+Mysql+sprnig)
  19. 匹配文本中的网址java正则表达式
  20. 图神经网络12-分子指纹GCN:Neural FPs

热门文章

  1. HDU 4773 Problem of Apollonius 圆的反演
  2. Leetcode 827.最大人工岛(Making A Large Island)
  3. 金软Visio文本抽出
  4. 集成easypoi实现excel图片导出
  5. Himall商城文件操作接口Commons
  6. python绘制动态心电图_Python-Evoked地形图可视化
  7. 循环遍历解决单词规律问题
  8. GBASE风采|南大通用与天津农商行羽毛球联谊赛圆满举行
  9. 使用 Ingress 实现金丝雀发布
  10. 移动的其实是“应用”