c++ 使用 tinyxml中对XML文件进行操作
2017-01-10 14:03
381 查看
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代码
<?xml version="1.0" encoding="UTF-8"?>
<phonebook>
<!--one item behalfs one contacted person.-->
<item>
<name>miaomaio</name>
<addr>Shaanxi Xi'an</addr>
<tel>13759911917</tel>
<email>miaomiao@home.com</email>
</item>
<item>
<name>gougou</name>
<addr>Liaoning Shenyang</addr>
<tel>15840330481</tel>
<email>gougou@home.com</email>
</item>
<!--more contacted persons.-->
</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>
下面我从这几个方面谈谈对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代码
<?xml version="1.0" encoding="UTF-8"?>
<phonebook>
<!--one item behalfs one contacted person.-->
<item>
<name>miaomaio</name>
<addr>Shaanxi Xi'an</addr>
<tel>13759911917</tel>
<email>miaomiao@home.com</email>
</item>
<item>
<name>gougou</name>
<addr>Liaoning Shenyang</addr>
<tel>15840330481</tel>
<email>gougou@home.com</email>
</item>
<!--more contacted persons.-->
</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>
相关文章推荐
- 使用tinyxml进行XML文件解析
- C#使用DOM进行XML文件的读写操作介绍
- tinyxml使用:创建XML,遍历打印xml文件 select操作,获取单个节点值,删除节点操作,修改节点操作,增加节点操作
- 使用JNI在JAVA和C++之间进行交互操作
- jsp使用DOM对xml文件进行操作的web小项目
- 毕业论文中使用的XML读取和制造工具!!!C++ 使用TinyXML解析XML文件
- C++ 操作XML文件 使用MSXML.DLL
- C++使用tinyxml来操作DOM对象(以svg格式为例,其他格式都类似操作)
- C++ 使用TinyXML解析XML文件
- C++中使用stringstream进行类型转换操作
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
- WinCE和Windows Mobile下使用TinyXML进行C++的开发
- C++ 使用TinyXML解析XML文件
- C++使用tinyXML操作XML
- TinyXML来操作XML文件(C++)
- C++ 使用TinyXML解析XML文件
- C++中操作XML文件开源库-TinyXml
- 如何在C++中使用cout进行高级的格式化输出操作
- 使用dom4j对xml文件进行读取和输出操作
- 使用jaxp对xml文件进行增删改查以及遍历操作