TinyXML读取XML文件 [大三四八九月实习]

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

Lxr

2013-09-12

1 TinyXMLXML的对应

1.1XML文件结构

<span style="font-size:14px;"><?xml version="1.0" encoding="gb2312" standalone="yes" ?>
<Root>


	<!- 注:端口信息的父标记只能为“ports” ->
	<ports>
		<port name="COM1" brate="9600"  data="8" odd_even_check_bit ="0" stop_bit="0">	</port>
		<port name="COM2" brate="9600"  data="8" odd_even_check_bit ="0" stop_bit="0">	</port>
		<port name="COM3" brate="9600"  data="8" odd_even_check_bit ="0" stop_bit="0">	</port>
		<!- ........->
	</ports>

	<!- 注:设备驱动信息的父标记只能为“drivers”->
	<drivers>
		<driver name="stm100">
			<var name="i" address="0" value="10">	</var>
			<var name="u" address="1" value="10">	</var>
			<var name="r" address="2" value="50">	</var>
		</driver>
	</drivers>


	<!- 注:设备信息的父标记只能为"devs"->
	<devs>
		<dev name="sta1" adress="1" cname="COM1" driver="stm100">	</dev> 
		<dev name="sta1" adress="2" cname="COM1" driver="stm100">	</dev> 
		<dev name="sta1" adress="3" cname="COM2" driver="stm100">	</dev> 
		<dev name="sta1" adress="4" cname="COM3" driver="stm100">	</dev> 
		<!- ........->
	</devs>

</Root></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的根元素

对于XML元素来说,TinyXML对其操作的类为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)读元素属性

对于TinyXML,操作XML中元素的属性用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

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

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

 

2TinyXMLXML文件函数例子

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

 

2.1 XML一行属性的函数

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

<span style="font-size:14px;">bool read_xml_oneline_attribute( TiXmlElement *XmlCurrentLine, xml_line &one_line )
{
       //当前行为空
       if ( !XmlCurrentLine )
       {
              return false;
       }



       //将XML文件当前行的起始标记保存
       strcpy( one_line.one_flag, XmlCurrentLine->Value() );


       //定义属性下标、XML属性对象指针
       int m;
       TiXmlAttribute *pAttribute; 
       m                = 0;
       pAttribute       = NULL;
       
        
       //取当前行的第一个属性
       pAttribute = XmlCurrentLine->FirstAttribute();
       if ( !pAttribute )
       {
               strcpy( one_line.attribute[m], EMPTY_FLAG );
	       return true;
       } 
       else
       {
              while ( pAttribute )
              {
	              //防止数组溢出
	              if ( m < LINE_ATT_SIZE )
	              {
			      //保存当前的属性到变量
			      strcpy( one_line.attribute[m], pAttribute->Value() );

			      //保存下一个
			      ++m;
	              }
	              
		      //下一属性
		      pAttribute        = pAttribute->Next();
              }
	      //让最后一个元素为空
	      strcpy( one_line.attribute[m], EMPTY_FLAG );
       }

       return true;
}</span>
 

2.2 遍历XML同层次元素函数

<span style="font-size:14px;">bool read_same_element( TiXmlElement *XmlCurrentLine, short int &index, const short int index_size,  xml_line one_line[] )
{
        index = 0;
	while ( XmlCurrentLine )
	{
	        if ( index < index_size )
		{
			//读当前子元素的标记和属性
			read_xml_oneline_attribute( XmlCurrentLine, one_line[index] );
		}

		//下一行
		XmlCurrentLine        = XmlCurrentLine->NextSiblingElement();
		if ( XmlCurrentLine )
		{
		        ++index;
		}
	}
       return true;
}</span>


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

 

此次笔记记录完毕。

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值