TinyXML-2解析XML数据
声明本文例子源自在C++中使用TinyXML2解析xml一文,其余部分来源于网络搜集,难免疏漏,敬请随意吐槽。 XML以及JSON什么是XML
我个人对XML了解不多,这次使用也是用来保存机器学习生成的模型,感觉上用XML来传输存储信息是很方便的。 XML和JSONJSON是另一种可以用来传输货保存信息的格式。根据Wikipedia-JSON的说法:
关于XML和JSON的比较,Wikipedia上如是说:
关于这一问题,在国内的知乎上也有各种讨论,比如:《为什么XML这么笨重的数据结构仍在广泛应用》、《为什么都反对 XML 而支持使用 JSON》。总结下来,基本也就是各有优势,具体选择还是需要根据需要判断。 XML解析库各种语言都有XML的解析方案,Java和Python都有方便的解析库。对于C++也有多种解析方案,可以参考《C++解析xml有什么好用的轮子》、《What XML parser should I use in C++?》。也有人做了一张图: 我最终选择了TinyXML2,使用挺方便简单。 话说Json似乎有个RapidJSON很好用(传说、传说而已),有空可以尝试一下。 TinyXML2配置TinyXML2TinyXML是一个C++的开源解析XML的解析库,根据TinyXML下载页面的介绍:
TinyXML已经停止开发了,现在推荐使用后续版本TinyXML2。 XinyXML2的文档:TinyXML2 Documentation。 使用的时候只需把项目下载下来,解压,把tinyxml2.h和tinyxml2.cpp拷到工程目录里。使用的时候加入 TinyXML2使用TinyXML2的使用可以参考TinyXML2 Documentation以及在C++中使用TinyXML2解析xml。 TinyXML读取文件使用TinyXML2读取文件可以使用: XMLDocument doc;
doc.LoadFile( "resources/dream.xml" );
TinyXML解析XML字符串使用TinyXML2解析内存中XML字符串可以使用: static const char* xml = "<element/>"; //XML字符串
XMLDocument doc;
doc.Parse( xml );//解析XML字符串
TinyXML解析XML数据在从文件或者字符串中取得XML数据之后,可以使用TinyXML2进行解析。 首先说明几个我用到的函数: //获取DOM的根元素,等同于FirstChildElement()
XMLElement* tinyxml2::XMLDocument::RootElement()
//取得第一个子元素(使用默认参数),或者根据const char * value的值获取第一个name等同value的子元素
const XMLElement* tinyxml2::XMLNode::FirstChildElement( const char * value = 0 ) const
//返回第一个子结点,如果不存在则返回null
const XMLNode *FirstChild () const
//根据valude返回当前node的下一名为valude的元素
const XMLElement * NextSiblingElement (const char *value=0) const
//返回列表中下一属性
const XMLAttribute * Next () const
//返回属性的名字,如<scene name="Depth">中name="Depth"为属性,其名字为name
const char * Name () const
//返回列表第一个属性值如<scene name="Depth">中name="Depth"为属性,其值为Depth
const XMLAttribute *FirstAttribute () const
//方便的访问元素内容的函数,如元素为<foo>This is text</foo>,则返回指向字符串"This is text"的指针。
const char* tinyxml2::XMLElement::GetText() const
具体例子参考在C++中使用TinyXML2解析xml,假设XML内容如下: <?xml version="1.0"?>
<scene name="Depth">
<node type="camera">
<eye>0 10 10</eye>
<front>0 0 -1</front>
<refUp>0 1 0</refUp>
<fov>90</fov>
</node>
<node type="Sphere">
<center>0 10 -10</center>
<radius>10</radius>
</node>
<node type="Plane">
<direction>0 10 -10</direction>
<distance>10</distance>
</node>
</scene>
对其进行测试代码为 #include <iostream>
#include <string>
#include"tinyxml2.h"
using namespace std;
int main()
{
tinyxml2::XMLDocument doc;
doc.LoadFile("test.xml");
tinyxml2::XMLElement *scene=doc.RootElement();
tinyxml2::XMLElement *surface=scene->FirstChildElement("node");
while (surface)
{
tinyxml2::XMLElement *surfaceChild=surface->FirstChildElement();
const char* content;
const tinyxml2::XMLAttribute *attributeOfSurface = surface->FirstAttribute();
cout<< attributeOfSurface->Name() << ":" << attributeOfSurface->Value() << endl;
while(surfaceChild)
{
content=surfaceChild->GetText();
surfaceChild=surfaceChild->NextSiblingElement();
cout<<content<<endl;
}
surface=surface->NextSiblingElement();
}
return 0;
}
输出结果为: 需要注意的是: XMLText* textNode = titleElement->FirstChild()->ToText();
title = textNode->Value();
printf( "Name of play (2): %sn",title );
总结以上就是一些TinyXML-2解析XML数据的简单介绍,之前想写的很多,写上才发现很多东西因为理解不够所以表述不清,只希望在作为自己的记录的同时,能够给刚刚接触TinyXML2的人一些简单的介绍,如有更多需求请参考官方文档。 Reference
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |