c++ 使用 tinyxml中对XML文件进行操作

本文详细介绍TinyXML C++类库的使用方法及理解。TinyXML是一款轻量级的XML解析库,支持基本的DOM操作,无需复杂的配置即可使用。文中通过实例展示了如何创建XML文档结构并保存为文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

tinyXML一款很优秀的操作C++类库,文件不大,但方法很丰富,和apache的Dom4j可以披靡啊!习惯了使用java类库的我看到这么丰富的c++类库,很高兴!它使用很简单,只需要拷贝几个文件到你的工程中,没有STL也可以编译运行。 
    
    下面我从这几个方面谈谈对tinyXML类库的使用以及理解。 

    首先在sourceforge上下载tinyXML类库,地址:http://sourceforge.net/projects/tinyxml/ 

    然后解压缩tinyXML后,将这六个文件添加到你的c++工程中,分别是tinystr.h、tinystr.cpp、tinyxml.h、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。在需要操作xml文件的地方,使用如下代码,就可以引入tinyXML类库。

 #include "tinyxml.h"

 

 

TiXmlBase是所有类的基类,TiXmlNode、TiXmlAttribute两个类都继承来自TiXmlBase类,其中TiXmlNode类指的是所有被<...>...<.../>包括的内容,而xml中的节点又具体分为以下几方面内容,分别是声明、注释、节点以及节点间的文本,因此在TiXmlNode的基础上又衍生出这几个类TiXmlComment、TiXmlDeclaration、TiXmlDocument、TiXmlElement、TiXmlText、TiXmlUnknown,分别用来指明具体是xml中的哪一部分。TiXmlAttribute类不同于TiXmlNode,它指的是在尖括号里面的内容,像<... ***=...>,其中***就是一个属性。这块我具体用一个xml文档说明一下,内容如下: 

Xml代码   收藏代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <phonebook>  
  3.     <!--one item behalfs one contacted person.-->  
  4.     <item>  
  5.         <name>miaomaio</name>  
  6.     <addr>Shaanxi Xi'an</addr>  
  7.     <tel>13759911917</tel>  
  8.     <email>miaomiao@home.com</email>  
  9.     </item>  
  10.     <item>  
  11.         <name>gougou</name>  
  12.     <addr>Liaoning Shenyang</addr>  
  13.     <tel>15840330481</tel>  
  14.     <email>gougou@home.com</email>  
  15.     </item>  
  16.     <!--more contacted persons.-->  
  17. </phonebook>  


 

  • 像TiXmlDeclaration指的就是<?xml version="1.0" encoding="UTF-8"?>,
  • 像TiXmlComment指的就是<!--one item behalfs one contacted person.-->、 <!--more contacted persons.-->,
  • 像TiXmlDocument指的就是整个xml文档,
  • 像TiXmlElement指的就是<phonebook>、<item>、<name>、<addr>等等这些节点,
  • 像TiXmlText指的就是‘gougou’、‘15840330481’这些夹在<item>与</item>、<name>与</name>、<addr>与</addr>之间的文本文字,
  • 像TiXmlAttribute指的就是<?xml version="1.0" encoding="UTF-8"?>节点中version、encoding,
  • 除此之外就是TiXmlUnknown。

 

 

const char* xmlFile = "Profiles\\MX6Q Linux Update\\OS Firmware\\ucl2.xml";  //xml΄???Ă???
  TiXmlDocument doc;
  TiXmlElement* UCL = new TiXmlElement("UCL");
  doc.LinkEndChild(UCL);

  TiXmlElement* CFG = new TiXmlElement("CFG");
  UCL->LinkEndChild(CFG);
  
  TiXmlElement* ST1 = new TiXmlElement("STATE");
  CFG->LinkEndChild(ST1);
  ST1->SetAttribute("name", "BootStrap");
  ST1->SetAttribute("dev", "MX6Q");
  ST1->SetAttribute("vid", "15A2");
  ST1->SetAttribute("pid", "0054");
  TiXmlElement* ST2 = new TiXmlElement("STATE");
  CFG->LinkEndChild(ST2);
  ST2->SetAttribute("name", "Updater");
  ST2->SetAttribute("dev", "MSC");
  ST2->SetAttribute("vid", "066F");
  ST2->SetAttribute("pid", "37FF");

  TiXmlElement* LIST = new TiXmlElement("LIST");
  UCL->LinkEndChild(LIST);

  LIST->SetAttribute("name", "GWI-SPI_NOR");
  LIST->SetAttribute("desc", "Choose SPI-NOR as media");
  
  TiXmlElement* CMD1 = new TiXmlElement("CMD");
  CMD1->SetAttribute("state", "BootStrap");
  CMD1->SetAttribute("type", "boot");
  CMD1->SetAttribute("body", "BootStrap");
  CMD1->SetAttribute("file", "firmware/u-boot.imx");
  CMD1->SetAttribute("ifdev", "MX6Q");
  CMD1->LinkEndChild(new TiXmlText("Loading u-boot"));
  LIST->LinkEndChild(CMD1);

  TiXmlElement* CMD2 = new TiXmlElement("CMD");
  CMD2->SetAttribute("state", "BootStrap");
  CMD2->SetAttribute("type", "load");
  CMD2->SetAttribute("file", "firmware/zImage");
  CMD2->SetAttribute("address", "0x12000000");
  CMD2->SetAttribute("loadSection", "OTH");
  CMD2->SetAttribute("setSection", "OTH");
  CMD2->SetAttribute("HasFlashHeader", "FALSE");
  CMD2->SetAttribute("ifdev", "MX6Q  MX6DL");
  CMD2->LinkEndChild(new TiXmlText("Loading kernel"));
  LIST->LinkEndChild(CMD2);

  TiXmlElement* CMD3 = new TiXmlElement("CMD");
  CMD3->SetAttribute("state", "BootStrap");
  CMD3->SetAttribute("type", "load");
  CMD3->SetAttribute("file", "firmware/initramfs");
  CMD3->SetAttribute("address", "0x12c00000");
  CMD3->SetAttribute("loadSection", "OTH");
  CMD3->SetAttribute("setSection", "OTH");
  CMD3->SetAttribute("HasFlashHeader", "FALSE");
  CMD3->SetAttribute("ifdev", "MX6Q MX6DL");
  CMD3->LinkEndChild(new TiXmlText("Loading Initramfs"));
  LIST->LinkEndChild(CMD3);

  TiXmlElement* CMD4 = new TiXmlElement("CMD");
  CMD4->SetAttribute("state", "BootStrap");
  CMD4->SetAttribute("type", "load");
  CMD4->SetAttribute("file", "firmware/imx6q-gwi-scanner.dtb");
  CMD4->SetAttribute("address", "0x18000000");
  CMD4->SetAttribute("loadSection", "OTH");
  CMD4->SetAttribute("setSection", "OTH");
  CMD4->SetAttribute("HasFlashHeader", "FALSE");
  CMD4->SetAttribute("ifdev", "MX6Q");
  CMD4->LinkEndChild(new TiXmlText("Loading device tree"));
  LIST->LinkEndChild(CMD4);

  TiXmlElement* CMD5 = new TiXmlElement("CMD");
  CMD5->SetAttribute("state", "BootStrap");
  CMD5->SetAttribute("type", "jump");
  CMD5->LinkEndChild(new TiXmlText("Jumping to OS image"));
  LIST->LinkEndChild(CMD5);

  TiXmlComment * comment = new TiXmlComment();
  comment->SetValue(" erase uboot env partition ");
  LIST->LinkEndChild(comment);

  TiXmlElement* CMD6 = new TiXmlElement("CMD");
  CMD6->SetAttribute("state", "Updater");
  CMD6->SetAttribute("type", "push");
  CMD6->SetAttribute("body", "$ flash_erase /dev/mtd1 0 0");
  CMD6->LinkEndChild(new TiXmlText("Erasing uboot env partition"));
  LIST->LinkEndChild(CMD6);

  TiXmlComment * comment1 = new TiXmlComment();
  comment1->SetValue(" erase script partition ");
  LIST->LinkEndChild(comment1);

  TiXmlElement* CMD7 = new TiXmlElement("CMD");
  CMD7->SetAttribute("state", "Updater");
  CMD7->SetAttribute("type", "push");
  CMD7->SetAttribute("body", "$ flash_erase /dev/mtd2 0 0");
  CMD7->LinkEndChild(new TiXmlText("Erasing system partition"));
  LIST->LinkEndChild(CMD7);

  TiXmlComment * comment2 = new TiXmlComment();
  comment2->SetValue(" burn the system to norflash ");
  LIST->LinkEndChild(comment2);

  TiXmlElement* CMD8 = new TiXmlElement("CMD");
  CMD8->SetAttribute("state", "Updater");
  CMD8->SetAttribute("type", "push");
  CMD8->SetAttribute("body", "send");
  CMD8->SetAttribute("file", a );
  CMD8->LinkEndChild(new TiXmlText("Send scanner system Image"));
  LIST->LinkEndChild(CMD8);

  TiXmlElement* CMD9 = new TiXmlElement("CMD");
  CMD9->SetAttribute("state", "Updater");
  CMD9->SetAttribute("type", "push");
  CMD9->SetAttribute("body", "$ dd if=$FILE of=/dev/mtd2");
  CMD9->LinkEndChild(new TiXmlText("write system Image to NOR Flash"));
  LIST->LinkEndChild(CMD9);

  TiXmlElement* CMD10 = new TiXmlElement("CMD");
  CMD10->SetAttribute("state", "Updater");
  CMD10->SetAttribute("type", "push");
  CMD10->SetAttribute("body", "$ echo Update Complete!");
  CMD10->LinkEndChild(new TiXmlText("Done"));
  LIST->LinkEndChild(CMD10);
  
  doc.SaveFile(xmlFile);  //???掄??、

生成的xml 文件

 

<UCL>
  <CFG>
    <STATE name="BootStrap" dev="MX6Q" vid="15A2" pid="0054"/>
    <STATE name="Updater"   dev="MSC" vid="066F" pid="37FF"/>
  </CFG>
<LIST name="GWI-SPI_NOR" desc="Choose SPI-NOR as media">
 <CMD state="BootStrap" type="boot" body="BootStrap" file ="firmware/u-boot.imx" ifdev="MX6Q">Loading U-boot</CMD>
 <CMD state="BootStrap" type="load" file="firmware/zImage" address="0x12000000"loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6DL">Loading Kernel.</CMD>
 <CMD state="BootStrap" type="load" file="firmware/initramfs" address="0x12C00000"loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q MX6DL">Loading Initramfs.</CMD>
 <CMD state="BootStrap" type="load" file="firmware/imx6q-gwi-scanner.dtb" address="0x18000000" loadSection="OTH" setSection="OTH" HasFlashHeader="FALSE" ifdev="MX6Q">Loading device tree.</CMD>
 <CMD state="BootStrap" type="jump" > Jumping to OS image.</CMD>
 <!--erase uboot env partition-->
 <CMD state="Updater" type="push" body="$ flash_erase /dev/mtd1  0 0">Erasing uboot env partition</CMD>
 <!--burn the system to spinor :-->
 <CMD state="Updater" type="push" body="$ flash_erase /dev/mtd2  0 0">Erasing system partition</CMD>
 <CMD state="Updater" type="push" body="send" file="xxxx">Sending scanner system</CMD>
 <CMD state="Updater" type="push" body="$ dd if=$FILE of=/dev/mtd2">write system Image to NOR flash</CMD>

 <CMD state="Updater" type="push" body="$ echo Update Complete!">Done</CMD>
</LIST>
</UCL>



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值