微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

tinyXML读取xml文件的方法

全面的总结一下TinyXML操作XML文件的过程,TinyXML中的类与XML文件结构成一一对应关系。

Lxr

2013-09-12

1 TinyXMLXML的对应

1.1XML文件结构

  1. <spanstyle="font-size:14px;"><?xmlversion="1.0"encoding="gb2312"standalone="yes"?>
  2. Root>
  3. <!-注:端口信息的父标记只能为“ports”->
  4. portsportname="COM1"brate="9600"data="8"odd_even_check_bit="0"stop_bit="0"></portportname="COM2"brate="9600"data="8"odd_even_check_bit="0"stop_bit="0"portname="COM3"brate="9600"data="8"odd_even_check_bit="0"stop_bit="0" <!-........- <!-注:设备驱动信息的父标记只能为“drivers”-driversdrivername="stm100"varname="i"address="0"value="10"varvarname="u"address="1"value="10"varname="r"address="2"value="50"driver <!-注:设备信息的父标记只能为"devs"-devsdevname="sta1"adress="1"cname="COM1"driver="stm100"devdevname="sta1"adress="2"cname="COM1"driver="stm100"devname="sta1"adress="3"cname="COM2"driver="stm100"devname="sta1"adress="4"cname="COM3"driver="stm100" <!-........-span>
 

I XML文件嵌套结构

(1)XML声明

[1]为XML文件声明,指明XML的版本为1.0,支持gb2312(可在XML中写中文),独立格式。声明主要是用来表面当前XML文件所遵循的XML标准。
 

(2)根元素

[2]XML的第一个根元素起始标记,与声明处于同一层次。在此XML文件中,其余元素都是[2]<Root>的子元素,结束标志在[32].

 

(3)注释结构

[5]XML注释的写法:<!-注释内容->

 

(4)子元素

[6][14][24]为以<Root>位起始标记的根元素下的第一层子元素起始标记,元素结束标记分别对应在[11][20][30]

[7] ~[9]为以<port>位起始标记的元素的子元素,也是以<Root>为起始标记的元素的第二层子元素。结束标记</ports>。以此类推。

 

元素之间可以多层嵌套,在内存的元素为外层元素的子元素

 

II元素结构

元素时构成XML文件的主要内容TinyXML读取XML文件时主要是对各元素的嵌套关系和对元素结构的读取。捡以上XML文件[16]元素来说明它具有的如下结构。

<var

name="i" address="0" value="10">

Text

</var>

元素起始标记

起始标记属性

文本

元素结束标记

文本部分在以上的XML中没有书写。属性、文本都是可以缺省的。

 

1.2TinyXML方法XML结构的对应

TinyXML眼里,对于已经存在的一个XML文件TinyXMLY也可以创建任意内容XML文件),可以分为5种情况来描述完对XML文件的读取。

 

I载入XML文件

对于,TinyXML,对应XML整个文件的类为tixmlDocument

tixmlDocument *pXmlDoc = NULL;

pXmlDoc = new tixmlDocument();

if( !pXmlDoc )

{

return false;

}

//加载目标XML文件

pXmlDoc->LoadFile( filename );

……

if( pXmlDoc )

{

delete pXmlDoc;

}

对于以上XML文件LoadFile方法载入已经存在的XML文件,同时这段代码也展示了使用new-delete的基本方法

 

II获取XML的根元素

对于元素来说,对其操作的类为tixmlElement

tixmlElement *pRootElement;

pRootElement = pXmlDoc->RootElement();

if ( !pRootElement )

{

return false;

}

对于以上XML文件,如果操作成功,则pRootElement指向根元素以起始标记<Root>的元素,pRootElement->Value();方法可获得根元素的起始标记

 

III获取根元素下的子元素

tixmlElement *pRootChild;

pRootChild = pRootElement->FirstChildElement();

if( ! pRootChild )

{

return false;

}

用指向当前元素的指针使用方法FirstChildElement();就可以获取当前元素下的子元素。对于以上XML文件,若方法操作成功,则pRootChild指向以<Ports>为起始标记的这一个元素。

 

IIII获取同层次的下一个元素

pRootChild = pRootChild-> NextSiblingElement();

使用NextSiblingElement();方法就可以获取pRootChild处于同层次下的下一个元素。对于以上XML文件,若此方法操作成功,则此时pRootChild指向以起始标记<drivers>的元素。如果下一个没有则pRootChild为空。

 

IIIII读取元素的属性、文本

以以下XML元素为例:

<var

name="i" address="0" value="10">

Text

</var>

元素起始标记

起始标记属性

文本

元素结束标记

如在以上XML文件中,此元素对于根元素来说处于XML文本中的第三层子元素。假设元素指针pRootCCChild指向这一个元素

 

(1)读元素起始标记

用指向当前元素的指针使用Value();方法即可访问。如pRootCCChild->Value();代表值”var”

 

(2)读元素属性

,操作中元素的属性tixmlAttribute

tixmlAttribute *pAttribute;

//取当前行的第一个属性

pAttribute = XmlCurrentLine->FirstAttribute();

if ( !pAttribute )

{

//…

}

//获取此元素的下一个属性

pAttribute = pAttribute->Next();

  • pAttribute = XmlCurrentLine->FirstAttribute();语句让pAttribute指向以上元素的一个属性name="i"属性name-value对的形式)。
  • pAttribute->Name();方法可以获取name,pAttribute->Value();方法获取i
  • pAttribute =pAttribute->Next();pAttribute指向“address="0"属性。如果往后不在有属性pAttribute为空。
 

(3)对元素文本内容Text

操作元素文本的类是tixmlElement利用方法GetText()即可获得文本内容

就这样就可以清晰地读出一个文件了。可以针对性的编写一个XML文件一行的函数(因为所有的XML文件的每一行都可以看成为“起始标记属性、文本、结束标记”组成的)。也可以针对同一层元素写一个遍历函数(只需在操作过后使用Next*)。

 

2TinyXMLXML文件函数例子

函数都有特殊用途,特殊用途部分可不参考。

 

2.1XML一行属性函数

可灵活扩展,将Text也读出来。

[cpp] ?
    <spanstyle="font-size:14px;">boolread_xml_oneline_attribute(tixmlElement*XmlCurrentLine,xml_line&one_line)
  1. {
  2. //当前行为空
  3. if(!XmlCurrentLine)
  4. {
  5. returnfalse;
  6. }
  7. //将XML文件当前行的起始标记保存
  8. strcpy(one_line.one_flag,XmlCurrentLine->Value());
  9. //定义属性下标、XML属性对象指针
  10. intm;
  11. tixmlAttribute*pAttribute;
  12. m=0;
  13. pAttribute=NULL;
  14. //取当前行的第一个属性
  15. pAttribute=XmlCurrentLine->FirstAttribute();
  16. if(!pAttribute)
  17. strcpy(one_line.attribute[m],EMPTY_FLAG);
  18. true;
  19. }
  20. else
  21. while(pAttribute)
  22. //防止数组溢出
  23. if(m<LINE_ATT_SIZE)
  24. //保存当前的属性到变量
  25. strcpy(one_line.attribute[m],pAttribute->Value());
  26. //保存下一个
  27. ++m;
  28. //下一属性
  29. pAttribute=pAttribute->Next();
  30. //让最后一个元素为空
  31. true;
  32. }</span>
 

2.2遍历XML同层次元素函数

?
    boolread_same_element(tixmlElement*XmlCurrentLine,shortint&index,constintindex_size,xml_lineone_line[])
  1. index=0;
  2. while(XmlCurrentLine)
  3. if(index<index_size)
  4. //读当前子元素的标记属性
  5. read_xml_oneline_attribute(XmlCurrentLine,one_line[index]);
  6. //下一行
  7. XmlCurrentLine=XmlCurrentLine->NextSiblingElement();
  8. if(XmlCurrentLine)
  9. ++index;
  10. }</span>

对于函数的参数函数的具体内容皆可不参考。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类