TinyXML读取XML文件 [大三四八九月实习]
来源:互联网 发布:淘宝店铺怎么绑定旺旺 编辑:程序博客网 时间:2024/05/21 10:15
全面的总结一下TinyXML操作XML文件的过程,TinyXML中的类与XML文件结构成一一对应关系。
Lxr
2013-09-12
1 TinyXML与XML的对应
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*)。
2TinyXML读XML文件函数例子
函数都有特殊用途,特殊用途部分可不参考。
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>
对于函数的参数函数的具体内容皆可不参考。
此次笔记记录完毕。
- TinyXML读取XML文件内容 [大三四八九月实习]
- TinyXML读取XML文件 [大三四八九月实习]
- TinyXML + VS2010项目配置 使用TinyXML类创建XML文件 [类中防内存泄露] [大三四八九月实习]
- XML文件的基本结构 [大三四八九月实习]
- 多线程执行 [大三四八九月实习]
- 第一个月实习总结 [大三四八九月实习]
- 第二月实习总结 [大三四八九月实习]
- 实习中的一总结 [大三四八九月实习]
- [Math] 排列组合 笔记 [大三四八九月实习]
- 排列组合应用于计数的思路 [大三四八九月实习]
- ACE结构和功能 [大三四八九月实习]
- 搭乘地铁|轻轨规律(^-^) [大三四八九月实习]
- C++ STL 容器 迭代器 算法 [大三四八九月实习]
- malloc/free和new/delete [大三四八九月实习]
- ACE在windows下的编译及配置(VS2010) [大三四八九月实习]
- BOOST 在windows的编译及配置(VS2010) [大三四八九月实习]
- BOOST timer库应用[timer库1] [大三四八九月实习]
- boost 库 timer组件的源码分析 [大三四八九月实习]
- 刘志军为什么能一手遮天
- mysql命令行操作
- [K/3Cloud] 在插件中为辅助资料赋值
- pyobjc实现鼠标事件模拟(Mac)
- iOS 本地化应用
- TinyXML读取XML文件 [大三四八九月实习]
- 异常 Exception与RuntimeException(2)
- 安卓手机ROM和RAM的区别
- LightOJ 1004 - Monkey Banana Problem
- 递归算法-----递归算法优化------非递归算法(递推,迭代)----运行时间
- LightOJ 1005 - Rooks
- 软基作业——顺序线性表的插入
- [C++基础]019_指针和引用(int*、int&、int*&、int&*、int**)
- [K/3Cloud] 调用其他界面时通过Session传递对象参数