XML的概念及其使用
1、引言
在实际的项目开发中,有时为了传递大量且又有一些组织关系的数据时,选择何种格式来存储数据就是需要考虑的问题了。假设要传递一组数据,需要包含:飞机类型(F22),重量(20000kg),航程(10000km);同时该飞机下挂载了几种类型的导弹:导弹1(Misile1)、重量(100kg)、射程(100km),导弹2(Missile2)、重量(200kg)、射程(200km)。
一般在使用网络通信的方式传递数据时,基本上传递的都是字符串,当然这也是和通信协议相关的。自认而然的,就会想着用字符串的形式来组织并传递上面一组数据了,为了体现出来有组织关系,就要引入一些特殊字符,最终组成的字符串可能就是如下所示的形式了:
string str = "";
str = "F22-20000-10000>Missile1-100-100>Missile2-200-200";
当数据元素少的时候还勉强能理解字符串,特殊字符 - 表示一个对象,特殊字符 > 表示组成关系。但是当数据量多时,甚至有多层嵌套关系时,在继续采用这种方式,那简直就是在给自己找麻烦了,此时 选择一个合理的结构来存储以上数据就很有必要了,而XML就是一个比较好的选择。
2、XML的概念
XML:eXtensible Markup Language,可扩展标记语言。是一种标记任意类型的数据并使其具有结构性的一种标记语言,说它是一种语言,并不是我们常说的某种开发语言,XML其实是一种标准,通过这种标准可以很容易的处理带有组织结构性质类型的数据。通过XML来处理以上的数据,最终可以采用如下所示的方式表达:
<F22 weight="20000" range="10000">
<Missile1 weight="100" range="100"/>
<Missile2 weight="200" range="200"/>
</F22>
如上所示,通过XML的方式可以很清晰的体现出的数据之间的组成及结构关系,且有很清晰的描述每一个数据代表的意义。
XML的基本组成是元素节点,一个元素节点可以具有属性,子元素节点,其中元素节点的范围以</>来表示,如上图所示,</F22>...</F22> 表示F22的元素节点,<Missile1 ... />就表示Missile1的元素节点,其中Missile1是F22的子元素节点。其实Missile1的表达方式有两种,还有一种表达方式是<Missile1>...</Missile1>,当该元素节点没有子元素节点时,可以采用第一种表示方式,这样会是XML的结构更简洁。
每一个元素节点都具有对应的属性,属性的表现形式为 属性名称=“属性值”,一般是写在元素节点的 <...> 内,具体书写方式请参考上面所示的写法。
3、TinyXML
目前有很多XML的操作库,像libxml、tinyxml等,在这里主要介绍tinyxml的使用。
tinyxml是一款开源软件,主要包含了两个头文件和四个源文件,使用方式也很灵活,即可以直接添加到工程文件中,也可以做成动态库的形式添加到工程中。tinyxml是以C++语言进行编写的,具体的实现方式不在此讨论,感兴趣的可以自行查看。
4、使用TinyXML操作XML文件
下面就介绍以下tinyxml中常用的使用方法:
读取XML文件:
TiXmlDocument *myDocument = new TiXmlDocument(); //创建XML文件的对象
myDocument->LoadFile(xmlFilePath); //将XML文件加载到XML文件的对象中,参数为XML文件路径
myDocument->Parse(xmlString); //将字符串格式的XML文件的内容加载到XML文件对象中
TiXmlElement *rootElement = myDocument->RootElement(); //获取XML文件对象的根元素节点
TiXmlElement *childElement = rootElement->FirstChildElement(); //读取XNL文件根节点的第一个子节点
childElement = childElement->NextSiblingElement(); //读取下一个子节点
string elementValue = childElement->Value(); //获得元素节点的名称。比如:"F22"、"Missile1"等
string attributeValue = childElement->Attribute("AttrbibuteName");//读取元素节点的属性,其中参数为属性的名称
创建XML文件:
TiXmlDocument *newDocument = new TiXmlDocument(); //创建一个新的XML文件的对象
TiXmlElement *rootElement = new TiXmlElement("elementName"); //创建新的元素节点,根节点
newDocument->LinkEndChild(rootElement); //将创建的新的元素节点添加到XML文件对象newDocument中
rootElement->SetAttribute("AttributeName", "AttributeValue");//设置新元素节点的属性,其中AttributeName表示属性的名称,AttributeValue表示属性的值
TiXmlElement *childElement = new TiXmlElement("elementName");//创建子元素节点
rootElement->LinkEndChild(childElement); //为元素节点rootElement添加子元素节点
newDocument->SaveFile(xmlFilePath); //将创建完成的XML保存成文件,其中xmlFilePath为保存路径
TiXmlPrinter *xmlPrinter = new TiXmlPrinter(); //将创建完成的XML文件保存成字符串形式
rootElement->Accept(xmlPrinter);
string xmlStr = xmlPrinter->CStr(); //转换成字符串
5、tinyxml的修改
由于tinyxml的开源特性,所以可以按照特定的要求修改tinyxml的源文件来实现类似于xml结构的文件的解析。基于任务的需要,需要完成对如下格式的文件的创建与解析:
(Fed
(Class Aircraft_1
(Attribute Position attr1 attr2)
)
(Class Aircraft_2
(Attribute Positin attr2 attr3)
)
(Class Comm attr1 attr2
(Parameter msg)
)
)
通过观察可以发现,上图所示的文件结构与XML有诸多相似之处,所以,本人利用tinyxml的源文件,经过修改最终实现上图所示文件的解析。
6、源文件下载
原始tinyxml源文件的下载地址:https://download.csdn.net/download/bailang_zhizun/10659571
修改后的tinyxml源文件的下载地址:https://download.csdn.net/download/bailang_zhizun/10659585