TinyXml2解析xml用法例子
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用法例子相关推荐
- TinyXML-2解析XML数据
声明 本文例子源自在C++中使用TinyXML2解析xml一文,其余部分来源于网络搜集,难免疏漏,敬请随意吐槽. XML以及JSON 什么是XML 根据Wikipedia-XML的说法: 可扩展标记语 ...
- C++ 本地使用tinyxml2解析Xml文件
1.基本介绍 TinyXML2是一个开源.简单.小巧.高效的C++ XML解析器,它只有一个.h文件和一个.cpp文件组成,可以轻松集成到其它程序中.非常方便我们使用c++对xml进行处理. 可以读取 ...
- 《转》 在C++中使用TinyXML2解析xml
读取和设置xml配置文件是最经常使用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,由于它的API接口和Java的十分类似.面向对象性非常好. TinyX ...
- C++使用TinyXml2解析Xml
1. TinyXml2 简介 TinyXml 一直是一个非常好用的 Xml 解析工具 , 最新的开源版本 TinyXml2 相对于旧版本的 TinyXml 使用更少的内存 , 更快 , 并且使用更少的 ...
- c++ tinyxml2 解析xml小坑
如题,项目中遇到的解析xml小坑: xml是python在windows下生成的,虽然是utf8的,但是回车是16进制显示的0D 0A,与linux下的回车不同(0A),导致使用Parse函数时解析失 ...
- tinyxml2解析XML文件
tinyxml2::XMLDocument xmlDoc;tinyxml2::XMLError error = xmlDoc.LoadFile(cfgFile.c_str());if (error ! ...
- Dom4j遍历解析XML测试
http://lavasoft.blog.51cto.com/62575/66953 Dom4j遍历解析XML测试 近来老和XML打交道,不深挖不行了.. 这是一个Dom4j解析XML的例子,为做复杂 ...
- php dom xml解析,PHP使用DOM解析XML
xml是一种严格的文档格式,有其自身的标准,解析xml,也有其标准,叫DOM标准.所有的xml.html都遵循DOM标准. 无论php,java,c,js,解析DOM树都遵循同样的DOM标准. 使用p ...
- C++调用tinyxml2读写xml
C++调用tinyxml2读写xml 本例子一共只需要3个文件 获取所有代码请到github下载地址: 哔哩哔哩有详细的视频讲解地址: main.cpp tinyxml2.h tinyxml2.cpp ...
最新文章
- Dynamics Ax 2012 – AIF Import CSV File
- JAVA服务器搭建之问题总结
- struts解决form提交的中文参数乱码问题
- NPV Formula in Excel
- mysql数据库入门教程(9):数据的常见约束
- Doing Homework HDU - 1074
- Azkaban简介及安装教程
- 稳态可压Navier-Stokes方程组在修正Dirichlet边界下的解的存在性
- Jenkins部署java项目实例
- 【土壤分类】基于支持向量机实现土壤分类附matlab代码
- 触目惊心的互联网流量劫持
- python各类地图绘制
- Copy and Paste GAN: Face Hallucination from Shaded Thumbnails
- 这六大要素教会你挑选合适的酒店管理系统
- 用户头像的背景为头像的模糊头像时候
- pci 中断冲突_如何解决IRQ冲突
- 机器学习Python学习——逻辑斯蒂回归(Logistic Regression)
- ssm毕设项目康健医药公司进销存管理22jao(java+VUE+Mybatis+Maven+Mysql+sprnig)
- 匹配文本中的网址java正则表达式
- 图神经网络12-分子指纹GCN:Neural FPs