tinyxml使用笔记与总结
tinyxml用法

tinyxml用法TinyXML是一个用于解析和生成XML文件的C++库。
它提供了一组简单且易于使用的API,可将XML文档解析为树状结构,让用户可以通过遍历这棵树来获取和修改XML文件中的内容。
本文将详细介绍TinyXML的使用方法,包括如何解析XML文件、访问节点、修改节点内容以及生成XML 文件等。
一、解析XML文件1.引入头文件和命名空间要使用TinyXML,首先需要引入头文件tinyxml.h:#include <tinyxml.h>然后在代码中使用命名空间:using namespace std;using namespace tinyxml2;2.打开并解析XML文件创建一个XML文档对象以及一个错误代码对象,然后调用LoadFile(方法打开并解析XML文件:XMLDocument doc;doc.LoadFile("example.xml");3.获取根节点使用RootElement(方法获取根节点:XMLElement* root = doc.RootElement(;4.遍历子节点可以使用FirstChildElement(方法获取第一个子节点,然后使用NextSiblingElement(方法依次获取下一个兄弟节点,直到遍历完所有子节点:for (XMLElement* child = root->FirstChildElement(; child != NULL; child = child->NextSiblingElement()//对子节点进行操作5.获取节点属性和内容使用Attribute(方法获取节点的属性值,使用GetText(方法获取节点的文本内容:const char* attributeValue = node->Attribute("属性名");const char* textContent = node->GetText(;二、访问和修改节点1.创建新节点可以使用NewElement(方法创建一个新节点,然后将其添加到指定节点的子节点列表中:XMLElement* newNode = doc.NewElement("节点名称");parentNode->InsertEndChild(newNode);2.修改节点属性和内容使用SetAttribute(方法设置节点的属性值,使用SetText(方法设置节点的文本内容:node->SetAttribute("属性名", "属性值");node->SetText("文本内容");3.删除节点使用DeleteChildren(方法删除节点的所有子节点:node->DeleteChildren(;4.复制节点可以使用CloneNode(方法复制一个节点:XMLElement* newNode = node->CloneNode(true);三、生成XML文件1.创建一个XML文档对象XMLDocument doc;2.创建根节点使用NewElement(方法创建一个根节点并将其添加到文档中:XMLElement* root = doc.NewElement("根节点名称");doc.InsertEndChild(root);3.创建子节点使用NewElement(方法创建一个子节点并将其添加到根节点的子节点列表中:XMLElement* child = doc.NewElement("子节点名称");root->InsertEndChild(child);4.创建属性使用SetAttribute(方法设置节点的属性值:child->SetAttribute("属性名", "属性值");5.创建文本内容使用SetText(方法设置节点的文本内容:child->SetText("文本内容");6.保存XML文件使用SaveFile(方法将XML文档保存为文件:doc.SaveFile("example.xml");以上就是TinyXML库的基本用法。
TinyXml查找唯一节点及修改节点操作

TinyXml查找唯一节点及修改节点操作TinyXml查找唯一节点及修改节点操作分类: C++ 算法 2012-10-17 23:22 238人阅读评论(0) 收藏举报[cpp]view plaincopy?1.// 读者对象:对TinyXml有一定了解的人。
本文是对TinyXml 工具的一些知识点的理解。
2.// 1 TinyXml中对TiXmlNode进行了分类,是用一个枚举进行描述的。
3.// enum NodeType4.// {5.// DOCUMENT, 文档节点6.// ELEMENT, 元素节点7.// COMMENT, 还没弄清楚8.// UNKNOWN, 未知节点9.// TEXT, 文本节点10.// DECLARATION, 声明节点11.// TYPECOUNT 还没弄清楚12.// };13.// TiXmlNode * pNode->Type() 函数可以返回节点的类型。
14.// 枚举的比较方法:TiXmlText::TEXT == pNode->Type();15.//16.// 这几个类型非常重要,尤其是在遍历xml时或者查找一个节点时17.// 我对节点和元素的理解如下:为了说明问题,我使用下面的xml文档来举例说明18.// <?xml version="1.0" encoding="gb2312"?>19.// <Persons>20.// <person Id="200" Shengao=34 ClassName="计本0508">21.// <name>vertor</name>22.// <age>20</age>23.// <address encode="utf-8">24.// <country>中国</country>25.// <province>山西</province>26.// <village>王大庄</village>27.// </address>28.// </person>29.// </Persons>30.//31.// 2.1 节点:一种对文档结构的描述对象32.// 2.2 元素:对文档某一个数据块的描述33.// 2.3 文本是指没有孩子的节点34.// 例如<village>大王庄</village> 文本节点是:"大王庄"35.// 然而判断一个节点是否是文本节点时并不是根据pNode->NoChildren()来判断,而是根据节点的类型来判断36.// 因为如果一个节点形如:<village></village>它也是没有孩子节点的。
TinyXml使用

这次使用了TinyXML后,觉得这个东西真是不错,于是将使用方法坐下总结来和大家分享。
该解析库在开源网站()上有下载,在本Blog也提供下载(下载TinyXML)TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux 中编译。
这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这课XML树。
注:DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系(理解html语言的读者会很容易理解这种树状模型)。
如下是一个XML片段:<Persons><Person ID="1"><name>周星星</name><age>20</age></Person><Person ID="2"><name>白晶晶</name><age>18</age></Person></Persons>在TinyXML中,根据XML的各种元素来定义了一些类:TiXmlBase:整个TinyXML模型的基类。
TiXmlAttribute:对应于XML中的元素的属性。
TiXmlNode:对应于DOM结构中的节点。
TiXmlComment:对应于XML中的注释。
TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
TiXmlDocument:对应于XML的整个文档。
TiXmlElement:对应于XML的元素。
TiXmlText:对应于XML的文字部分。
TiXmlUnknown:对应于XML的未知部分。
TiXmlHandler:定义了针对XML的一些操作。
使用TinyXml对XML进行遍历

使用TinyXml对XML进行遍历```cpp#include "tinyxml.h"```接下来,我们需要创建一个`TiXmlDocument`对象,并使用其`LoadFile`函数加载要解析的XML文件。
```cppTiXmlDocument doc("example.xml");bool loadSuccess = doc.LoadFile(;if (!loadSuccess)//文件加载失败return;```一旦文件加载成功,我们就可以开始遍历XML文档了。
首先,我们可以通过调用`RootElement`函数获取XML文档的根元素。
```cppTiXmlElement* rootElement = doc.RootElement(;if (!rootElement)//根元素不存在return;```然后,我们可以使用`FirstChildElement`函数获取根元素的第一个子元素。
如果没有子元素,该函数将返回空指针。
```cppTiXmlElement* childElement = rootElement->FirstChildElement(;while (childElement)//处理子元素childElement = childElement->NextSiblingElement(;``````cppconst char* attributeName = "name";const char* attributeValue = childElement->Attribute(attributeName);if (attributeValue)//处理属性值```要获取元素的文本内容,可以使用`GetText`函数。
```cppconst char* elementText = childElement->GetText(;if (elementText)//处理文本内容```在遍历子元素时,我们可以使用`FirstChildElement`函数获取子元素的第一个子元素,并使用`NextSiblingElement`函数获取下一个兄弟元素。
TinyXML(TinyXPath) 使用总结

原来的Windows 平台下的项目使用了MSXML组件来访问Web Service 接口,后来因为跨平台的需要,在Linux平台下改用了GSOAP+TinyXML(TinyXPath)来完成所需功能。
使用TinyXPath还是遇到了一些问题,总结一下。
这里要说明一下TinyXPath是TinyXML+XPath,下载TinyXPath包的时候会包含TinyXML的原文件。
1. 使用XPath,来获取XML子节点TinyXpath所支持的XPath并不完整,而且缺少文档资料,试了一整天才试出来,直接把结果写下来1.)节点名大小写无关匹配这里要用到name函数和translate函数,首先转化所有的节点名到大写,然后再比较。
语法如下:*[translate(name(),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')='XXXX']name函数返回节点名字,translate函数转换到大写。
2.)节点内容比较text函数返回节点内容,语法为*[text()='XXXX']3.)选择固定位置节点position函数用以指定第几个节点,语法为:*[position()=XXX] ,此处是数字类型举个例子,我们要选定节点名字为AAA,内容为BBB的第二个节点,XPath应改名为:*[translate(name(),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ')='AAA' and text()='BBB' and position()=2]这里还有个查询效率问题,并不确定把 position()=2 条件放在最前面是不是可以提高效率。
以上内容可以封装成一个函数:inline string getNodeXPath(const string & strNodeName, string strText="", string pos=""){string strVal;strVal += "*[";strVal += "translate(name(),'abcdefghijklmnopqrstuvwxyz','ABCDEFGHIJKLMNOPQRSTUVWXYZ') = '"+ strNode Name + "'";if(!strText.empty())strVal +=" and text()= '" +strText+"'";if(!pos.empty())strVal +=" and position()= " +pos;strVal += "]";return strVal;}#define NODE(node) getNode(node)#define NODE_AT(node,pos) getNode(node,"",pos)4.) 查询子节点满足一定条件的节点没有看到TinyXPath提供的直接可以获取子节点内容的函数,这里使用变通的方法,即先判断子节点条件然后使用parent关键词指定返回父节点,定义了HAS_CHILD宏#define HAS_CHILD(node,txt)string(string("/")+getNode(node,txt)+string("/parent::*"))举个例子:string strXPath;strXPath= "/" + NODE("XMLDATA") + "/" + NODE("RATES") ;strXPath+= "/" + NODE("REPORATEVO")+HAS_CHILD("TERMBYYEAR",mStrType)+HAS_CHILD("CONTRACTDATE",mStrSubTyp e);strXPath+= "/" + NODE("RATE");多个HAS_CHILD之间是并列关系。
TinyXml使用指南

TinyXml使用指南一、 TinyXml的特点TinyXml是一个基于DOM模型的、非验证的轻量级C++解释器。
1. SAX和DOM目前XML的解析主要有两大模型:SAX和DOM。
其中SAX是基于事件的,其基本工作流程是分析XML文档,当发现了一个新的元素时,产生一个对应事件,并调用相应的用户处理函数。
这种方式占用内存少,速度快,但用户程序相应得会比较复杂。
而DOM(文档对象模型),则是在分析时,一次性的将整个XML文档进行分析,并在内存中形成对应的树结构,同时,向用户提供一系列的接口来访问和编辑该树结构。
这种方式占用内存大,速度往往慢于SAX,但可以给用户提供一个面向对象的访问接口,对用户更为友好。
2. 验证和非验证对于一个特定的XML文档而言,其正确性分为两个层次。
首先是其格式应该符合XML的基本格式要求,比如第一行要有声明,标签的嵌套层次必须前后一致等等,符合这些要求的文件,就是一个合格的XML文件,称作well-formatted。
但除此之外,一个XML文档因其内容的不同还必须在语义上符合相应的标准,这些标准由相应的DTD 文件或者Schema文件来定义,符合了这些定义要求的XML文件,称作valid。
因此,解析器也分为两种,一种是验证的,即会跟据XML文件中的声明,用相应的DTD文件对XML文件进行校验,检查它是否满足DTD文件的要求。
另一种是忽略DTD文件,只要基本格式正确,就可以进行解析。
就我所知,验证的解析器通常都是比较重量级的。
TinyXml不支持验证,但是体积很小,用在解析格式较为简单的XML文件,比如配置文件时,特别的合适。
二、 TinyXml的构建和使用1. 获取TinyXml首页在/tinyxml/index.html,从这里可以找到最新版本的源代码,目前的版本是2.3.4。
2.构建TinyXml在构建时可以选择是否支持STL,选择的话,则可以使用std::string,所以通常应该打开这个选项。
TinyXML中文指南
TinyXML 指南这是什么?这份指南有一些关于如何有效地使用TinyXML的技巧和建议。
我也会尝试讲一些诸如怎样使字符串与整型数相互转化的C++技巧。
这与TinyXML本身没什么关系,但它也许会对你的项目有所帮助,所以我还是把它加进来了。
如果你不知道基本的C++概念,那么这份指南就没什么用了。
同样的,如果你不知道什么是DOM,那先从其它地方找来看看吧。
在我们开始之前一些将会被用到的XML数据集/文件。
example1.xml:<?xml version="1.0" ?><Hello>World</Hello>example2.xml:<?xml version="1.0" ?><poetry><verse>AlasGreat WorldAlas (again)</verse></poetry>example3.xml:<?xml version="1.0" ?><shapes><circle name="int-based" x="20" y="30" r="50" /><point name="float-based" x="3.5" y="52.1" /></shapes>example4.xml:<?xml version="1.0" ?><MyApp><!–Settings for MyApp –><Messages><Welcome>Welcome to MyApp</Welcome><Farewell>Thank you for using MyApp</Farewell></Messages><Windows><Window name="MainFrame" x="5" y="15" w="400" h="250" /></Windows><Connection ip="192.168.0.1" timeout="123.456000" /></MyApp>开始把文件加载成XML把一个文件加载成TinyXML DOM的最简单方法是:TiXmlDocument doc( "demo.xml" );doc.LoadFile();一个更接近于现实应用的例子如下。
Linux下TinyXml库使用方法及实例解析
Linux下TinyXml库使⽤⽅法及实例解析 TinyXml库下载,我保存在⾃⼰的⽹盘中,可⾃⾏下载:链接:提取码:e50y⾸先介绍⼀下TinyXml类XmlBase:整个TinyXML模型的基类;XmlAttribute:对应于XML中的元素的属性;XmlComment:对应于XML中的注释,评论类;XmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>;XmlElement:对应于XML的元素;XmlDocument:对应于XML的整个⽂档;XmlText:对应于XML的⽂字部分;XmlUnknown:对应于XML的未知部分;XmlHandler:定义了针对XML的⼀些操作;类之间的关系如下:需要注意的是:元素⼀定的节点,节点不⼀定是元素(TiXmlElement类)⼀.加载XML⽂件//加载XML⽂件TiXmlDocument doc;if(!doc.LoadFile("test.xml")){qDebug()<<"加载XML⽂件失败";const char *errorStr = doc.ErrorDesc();qDebug()<<errorStr; //打印失败原因;}⼆.获取XML 的根节点//加载XML⽂件TiXmlDocument doc;if(!doc.LoadFile("test.xml")){qDebug()<<"加载XML⽂件失败";const char *errorStr = doc.ErrorDesc();qDebug()<<errorStr; //打印失败原因;}else{//获取根节点元素TiXmlElement *root = doc.FirstChildElement();}三.常⽤⽅法TiXmlDocument doc;doc.LoadFile("test.xml");TiXmlElement *root = doc.FirstChildElement(); //获取根节点元素QString ElementName = root->Value(); //获取元素名bool Children = root->NoChildren(); //判断该元素是否有⼦元素返回true 有,false 没有TiXmlElement *child = root->FirstChildElement(); //获取root元素下的第⼀个⼦元素child = root->FirstChildElement("major"); //获取root元素的⼦元素指定元素名字(major)TiXmlElement *brother = child->NextSiblingElement(); //获取child元素的下⼀个兄弟元素brother = child->NextSiblingElement("specVersion"); //获取child元素的兄弟元素指定元素名字(specVersion)QString text = brother->GetText(); //获取brother元素的值TiXmlAttribute *Attribute = brother->FirstAttribute(); //获取brother元素的第⼀个属性QString AttributeName = Attribute->Name(); //获取Attribute属性的名字QString AttributeValue = Attribute->Value(); //获取Attribute属性的值AttributeValue = brother->Attribute("AttributeName"); //获取brother的属性名为(AttributeName)的值TiXmlDocument *myDocument = new TiXmlDocument(); //创建⼀个XML⽂件TiXmlDeclaration *pDeclaration=new TiXmlDeclaration("1.0","UTF-8",""); //创建xml⽂件头(<?xml version="1.0" encoding="UTF-8" ?>)myDocument->LinkEndChild(pDeclaration); //加⼊将xml⽂件头加⼊⽂档中TiXmlElement *BUSINESS=new TiXmlElement("BUSINESS"); //创建⼀个元素节点myDocument->LinkEndChild(BUSINESS); //加⼊BUSINESS元素节点到⽂档中TiXmlElement *COUNTRY = new TiXmlElement("COUNTRY"); //创建两个节点TiXmlElement *PLANET = new TiXmlElement("PLANET");BUSINESS->LinkEndChild(PLANET); //将新建的节点加到BUSINESS下⼀级BUSINESS->LinkEndChild(COUNTRY);TiXmlText *PLANETtxt = new TiXmlText("one"); //添加节点内的⽂本TiXmlText *COUNTRYtxt = new TiXmlText("china");COUNTRY->LinkEndChild(COUNTRYtxt);PLANET->LinkEndChild(PLANETtxt);myDocument->SaveFile("test.xml"); //保存xml下⾯介绍⼀个实例解析使⽤TinyXML库进⾏解析时,只需要将其中的6个⽂件拷贝到项⽬中就可以直接使⽤了,这六个⽂件是:tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp;XML⽂件如下---test.xml1 <School name="软件学院">2 <Class name = "C++">3 <Student name="tinyxml" number="123">4 <email>tinyxml@</email>5 <address>中国</address>6 </Student>7 <Student name="jsoncpp" number="456">8 <email>jsoncpp@</email>9 <address>美国</address>10 </Student>1112 </Class>1314 </School>~解析实例代码为:readxml.cpp1 #include<iostream>2 #include"tinyxml.h"3 #include<string>45using namespace std;67int main()8 {9const char * xmlFile = "test.xml";10 TiXmlDocument doc;11if(doc.LoadFile(xmlFile)){12 doc.Print();13 }else{14 cout << "can not parse xml school" << endl;1516 }17 TiXmlElement* rootElement = doc.RootElement();18 TiXmlElement* classElement = rootElement->FirstChildElement();19 TiXmlElement* studentElement = classElement->FirstChildElement();2021for(; studentElement != NULL; studentElement = studentElement->NextSiblingElement()){22 TiXmlAttribute* attribute0fStudent = studentElement->FirstAttribute();23for(; attribute0fStudent != NULL; attribute0fStudent = attribute0fStudent->Next()){24 cout << attribute0fStudent->Name() << " : " << attribute0fStudent->Value() << endl ;25 }26 TiXmlElement* studentContactElement = studentElement->FirstChildElement();27for(; studentContactElement != NULL; studentContactElement = studentContactElement->Ne xtSiblingElement()){28string contactType = studentContactElement->Value();29string contactValue = studentContactElement->GetText();30 cout << contactType << " : " << contactValue << endl;31 }32 }33return0;34 }35~如下为我⼯程下的⽂件csc105@csc105:~/workspace/configure-the-lower-computer/zmqcore/test_t/template/tinyxml$ lsreadxml test.xml tinystr.h tinyxmlerror.cpp tinyxmlparser.cppreadxml.cpp tinystr.cpp tinyxml.cpp tinyxml.h运⾏执⾏⽂件,解析结果为:csc105@csc105:~/workspace/configure-the-lower-computer/zmqcore/test_t/template/tinyxml$ ./readxml <School name="软件学院"><Class name="C++"><Student name="tinyxml" number="123"><email>tinyxml@</email><address>中国</address></Student><Student name="jsoncpp" number="456"><email>jsoncpp@</email><address>美国</address></Student></Class></School>name : tinyxmlnumber : 123email : tinyxml@address : 中国name : jsoncppnumber : 456email : jsoncpp@address : 美国到此,完成了XML 实例的解析最后感谢原博主:https:///qq_26374395/article/details/80171906。
关于tinyxml在LINUX环境下的使用
关于tinyxml在LINUX环境下的使用TinyXML是一个跨平台的C++库,用于读取、解析和生成XML文件。
它提供了一个简单、易用的API,可以用于在Linux环境下进行XML文件的处理。
要在Linux环境下使用TinyXML,首先需要在系统上安装该库。
可以通过源码安装或使用包管理工具进行安装。
以下是在Ubuntu上使用apt包管理器安装的示例命令:```shellsudo apt-get install libtinyxml2-dev```安装完成后,就可以在项目中使用TinyXML库了。
下面是一个简单的示例代码,演示了如何使用TinyXML在Linux环境下解析和生成XML文件:```cpp#include <iostream>#include <tinyxml2.h>using namespace tinyxml2;int main//解析XML文件XMLDocument doc;doc.LoadFile("test.xml");if (doc.Error()std::cout << "Failed to load XML file." << std::endl; return 1;}//获取根元素XMLElement* root = doc.RootElement(;if (root == nullptr)std::cout << "Failed to get root element." << std::endl; return 1;}//遍历子元素XMLElement* child = root->FirstChildElement(;while (child != nullptr)const char* value = child->Value(;std::cout << "Element: " << value << std::endl;//获取元素属性const XMLAttribute* attribute = child->FirstAttribute(; while (attribute != nullptr)const char* attributeName = attribute->Name(;const char* attributeValue = attribute->Value(;std::cout << "Attribute: " << attributeName << " = " << attributeValue << std::endl;attribute = attribute->Next(;}child = child->NextSiblingElement(;}//生成XML文件XMLDocument newDoc;XMLNode* newRoot = newDoc.NewElement("Root");newDoc.InsertFirstChild(newRoot);XMLElement* newElement = newDoc.NewElement("Element");newElement->SetAttribute("Attribute", "Value");newRoot->InsertEndChild(newElement);newDoc.SaveFile("new_test.xml");return 0;```这个例子中,首先通过`XMLDocument::LoadFile`函数载入一个XML 文件(test.xml)。
tinyxml使用文档
tinyxml使用文档TinyXML是一个用于解析和生成XML文档的C++库。
它提供了简单而高效的API,使得在C++中处理XML变得容易。
本文将介绍TinyXML的基本使用方法,包括XML的解析、创建和修改。
1. 引入TinyXML库2.解析XML文档要解析XML文档,可以使用TinyXML提供的XMLDocument类。
首先,需要创建一个XMLDocument对象,并通过调用其LoadFile(方法加载XML 文件。
以下是一个解析XML文档的示例:```cpp#include "tinyxml.h"int mainTiXmlDocument doc;if (doc.LoadFile("example.xml"))TiXmlElement* root = doc.RootElement(;if (root)//处理根元素//...}}return 0;```在上面的示例中,首先创建一个XMLDocument对象,并通过调用LoadFile(方法加载名为"example.xml"的XML文件。
然后,通过调用RootElement(方法获取根元素,并进行进一步处理。
3.遍历XML元素要遍历XML元素,可以使用TiXmlElement类的NextSiblingElement(和FirstChildElement(方法。
NextSiblingElement(方法返回下一个同级元素,而FirstChildElement(方法返回第一个子元素。
以下是一个遍历XML元素的示例:```cppTiXmlElement* element = root->FirstChildElement(;while (element)//处理元素//...element = element->NextSiblingElement(;```在上面的示例中,首先通过调用FirstChildElement(方法获取第一个子元素,然后使用一个循环遍历所有同级元素。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
tinyxml使用笔记与总结tinyxml使用笔记与总结tinyxml使用笔记与总结在TinyXML中,根据XML的各种元素来定义了一些类:TiXmlBase:整个TinyXML模型的基类。
TiXmlAttribute:对应于XML中的元素的属性。
TiXmlNode:对应于DOM结构中的节点。
TiXmlComment:对应于XML中的注释。
TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
TiXmlDocument:对应于XML的整个文档。
TiXmlElement:对应于XML的元素。
TiXmlText:对应于XML的文字部分。
TiXmlUnknown:对应于XML的未知部分。
TiXmlHandler:定义了针对XML的一些操作。
例如:<?xml version="1.0" standalone=no><!– Our to do list data –><ToDo><Item priority="1"> Go to the <bold>Toy store!</bold></Item><Item priority="2"> Do bills</Item></ToDo> 整个对象树:TiXmlDocument "demo.xml"TiXmlDeclaration "version=’1.0′" "standalone=no"TiXmlComment " Our to do list data"TiXmlElement "ToDo"TiXmlElement "Item" Attribtutes: priority = 1TiXmlText "Go to the "TiXmlElement "bold"TiXmlText "Toy store!"TiXmlElement "Item" Attributes: priority=2TiXmlText "Do bills"在tinyXML中,用FirstChild("名字")查找节点时,调用FirstChild函数的节点与要查找的节点必须成“父子关系”。
句柄想要健壮地读取一个XML文档,检查方法调用后的返回值是否为null是很重要的。
一种安全的检错实现可能会产生像这样的代码:当然,你也可以用MultiByteToWideChar,WideCharToMultiByte函数自己实现转换.以上是简单应用的几个举例,理解他们,相信你已经能写出满足自己需要的代码了. TiXmlElement* root = document.FirstChildElement( "Document" );if ( root ){TiXmlElement* element = root->FirstChildElement( "Element" );if ( element ){TiXmlElement* child = element->FirstChildElement( "Child" );if ( child ){TiXmlElement* child2 = child->NextSiblingElement( "Child" );if ( child2 ){// Finally do something useful. 用句柄的话就不会这么冗长了,使用TiXmlHandle类,前面的代码就会变成这样:TiXmlHandle docHandle( &document );TiXmlElement* child2 =docHandle.FirstChild( "Document" ).FirstChild( "Element" ).C hild( "Child", 1 ).ToElement();if ( child2 ){// do something useful 一、读取XML,设置节点文本如下XML片段:<?xml version="1.0" encoding="UTF-8" standalone="yes" ?><ZXML><ZAPP><VBS_RUNTIME_PARAMS><BROADCAST_VERSION info="版本">8</BROADCAST_VERSION><Broadcast><FileCount info="资源文件个数">69</FileCount><SOURCE_1><ID info="图片编号">1</ID><Version info="图片版本">1</Version><Path info="图片路径">/mnt/share/1.bmp</Path><FileMode info="文件处理模式">0</FileMode></SOURCE_1><SOURCE_2><Path info="图片路径">/mnt/share/2.bmp</Path><ID info="图片编号">2</ID><Version info="图片版本">1</Version><FileMode info="文件处理模式">0</FileMode></SOURCE_2>.</Broadcast></VBS_RUNTIME_PARAMS></ZAPP></ZXML>要设置BROADCAST_VERSION节点的值8为其他值,可参考如下代码(将值加1):用ReplaceChild( TiXmlNode* replaceThis, constTiXmlNode& withThis )方法替换TiXmlDocument doc("zapp.conf");doc.LoadFile();TiXmlHandle docHandle( &doc );TiXmlElement* Broadcast_ver =docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("V BS_RUNTIME_PARAMS").FirstChildElement("BROADCAST_VE RSION").ToElement();TiXmlNode * oldnode = Broadcast_ver->FirstChild();const char *ver = Broadcast_ver->GetText();int oldVer = atoi(ver);CString newVer;newVer.Format("%d",oldVer+1);TiXmlText newText(newVer);Broadcast_ver->ReplaceChild(oldnode,newText);AfxMessageBox(Broadcast_ver->GetText());//输出值doc.SaveFile();二,删除节点,属性值RemoveChild( TiXmlNode* removeThis )方法删除父节点的子节点,RemoveAttribute( const char * name )方法删除属性值.例如删除BROADCAST_VERSION节点TiXmlHandle docHandle( &doc );TiXmlElement* Broadcast_ver =docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("V BS_RUNTIME_PARAMS").ToElement();TiXmlNode * node = Broadcast_ver->FirstChild("BROADCAST_VERSION");Broadcast_ver->RemoveChild(node);也可以删除整个SOURCE_1节点:TiXmlHandledocHandle( &doc );TiXmlElement* Broadcast =docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("V BS_RUNTIME_PARAMS").FirstChild("Broadcast").ToElement();TiXmlNode * node = Broadcast->FirstChild("SOURCE_1");Broadcast->RemoveChild(node);删除BROADCAST_VERSION的info属性:TiXmlHandle docHandle( &doc );TiXmlElement* Broadcast_ver =docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("V BS_RUNTIME_PARAMS").FirstChildElement("BROADCAST_VE RSION").ToElement();Broadcast_ver->RemoveAttribute("info"); //删除info可以借助NextSiblingElement()方法实现递归删除.三,添加节点,属性值例如在SOURCE_3下添加BROADCAST_PID节点:TiXmlHandle docHandle( &doc );TiXmlElement* Broadcast =docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("V BS_RUNTIME_PARAMS").FirstChild("Broadcast").ToElement();TiXmlElement* Broadcast_Pid = newTiXmlElement("BROADCAST_PID");TiXmlText *text =new TiXmlText("7215");Broadcast_Pid->SetAttribute("info","the pid");Broadcast_Pid->LinkEndChild(text);Broadcast->LinkEndChild(Broadcast_Pid);将在SOURCE_3后添加新的节点:<BROADCAST_PIDinfo="the pid">7215</BROADCAST_PID>四,最后说一下中文乱码的问题乱码是由于GB2312与UTF8之间转换不当造成的,tinyxml 在处理UTF8本身没有问题,当你打开一个UTF8的文档,可以在加载的时候指定UTF8的方式,或者文档声明处指明的编码格式,tinyxml会按照相应的编码格式加载,但很多时候当我们输出或写入中文字段时会出现乱码,无论在内存,还是打印出来的内容.这是因为我们的软件通常是GB2312编码,而读取或写入的内容是UTF8,自然就会出错.可以借助网上的两个函数来实现转换(原作者不详): voidConvertUtf8ToGBK(CString& strUtf8){int len=MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, NULL,0);unsigned short * wszGBK = new unsignedshort[len+1];memset(wszGBK, 0, len * 2 + 2);MultiByteToWideChar(CP_UTF8, 0, (LPCTSTR)strUtf8, -1, wszGBK, len);len = WideCharToMultiByte(CP_ACP, 0, wszGBK, -1, NULL, 0, NULL, NULL);char *szGBK=new char[len + 1];memset(szGBK, 0, len + 1);WideCharToMultiByte (CP_ACP, 0, wszGBK, -1, szGBK, len, NULL,NULL);strUtf8 = szGBK;delete[] szGBK;delete[] wszGBK;} void ConvertGBKToUtf8(CString& strGBK){int len=MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, NULL,0);unsigned short * wszUtf8 = new unsignedshort[len+1];memset(wszUtf8, 0, len * 2 + 2);MultiByteToWideChar(CP_ACP, 0, (LPCTSTR)strGBK, -1, wszUtf8, len);len = WideCharToMultiByte(CP_UTF8, 0, wszUtf8, -1, NULL, 0, NULL, NULL);char *szUtf8=new char[len + 1];memset(szUtf8, 0, len + 1);WideCharToMultiByte (CP_UTF8, 0, wszUtf8, -1, szUtf8, len, NULL,NULL);strGBK = szUtf8;delete[] szUtf8;delete[] wszUtf8;}。