tinyxml使用笔记与总结

合集下载

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查找唯一节点及修改节点操作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使用

这次使用了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进行遍历

使用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) 使用总结

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的特点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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

tinyxml使用笔记与总结tinyxml使用笔记与总结tinyxml使用笔记与总结在TinyXML中,根据XML的各种元素来定义了一些类:TiXmlBase:整个TinyXML模型的基类。

TiXmlAttribute:对应于XML中的元素的属性。

TiXmlNode:对应于DOM结构中的节点。

TiXmlComment:对应于XML中的注释。

TiXmlDeclaration:对应于XML中的申明部分,即&lt;?versiong="1.0" ?&gt;。

TiXmlDocument:对应于XML的整个文档。

TiXmlElement:对应于XML的元素。

TiXmlText:对应于XML的文字部分。

TiXmlUnknown:对应于XML的未知部分。

TiXmlHandler:定义了针对XML的一些操作。

例如:&lt;?xml version="1.0" standalone=no&gt;&lt;!– Our to do list data –&gt;&lt;ToDo&gt;&lt;Item priority="1"&gt; Go to the &lt;bold&gt;Toy store!&lt;/bold&gt;&lt;/Item&gt;&lt;Item priority="2"&gt; Do bills&lt;/Item&gt;&lt;/ToDo&gt; 整个对象树: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-&gt;FirstChildElement( "Element" );if ( element ){TiXmlElement* child = element-&gt;FirstChildElement( "Child" );if ( child ){TiXmlElement* child2 = child-&gt;NextSiblingElement( "Child" );if ( child2 ){// Finally do something useful. 用句柄的话就不会这么冗长了,使用TiXmlHandle类,前面的代码就会变成这样:TiXmlHandle docHandle( &amp;document );TiXmlElement* child2 =docHandle.FirstChild( "Document" ).FirstChild( "Element" ).C hild( "Child", 1 ).ToElement();if ( child2 ){// do something useful 一、读取XML,设置节点文本如下XML片段:&lt;?xml version="1.0" encoding="UTF-8" standalone="yes" ?&gt;&lt;ZXML&gt;&lt;ZAPP&gt;&lt;VBS_RUNTIME_PARAMS&gt;&lt;BROADCAST_VERSION info="版本"&gt;8&lt;/BROADCAST_VERSION&gt;&lt;Broadcast&gt;&lt;FileCount info="资源文件个数"&gt;69&lt;/FileCount&gt;&lt;SOURCE_1&gt;&lt;ID info="图片编号"&gt;1&lt;/ID&gt;&lt;Version info="图片版本"&gt;1&lt;/Version&gt;&lt;Path info="图片路径"&gt;/mnt/share/1.bmp&lt;/Path&gt;&lt;FileMode info="文件处理模式"&gt;0&lt;/FileMode&gt;&lt;/SOURCE_1&gt;&lt;SOURCE_2&gt;&lt;Path info="图片路径"&gt;/mnt/share/2.bmp&lt;/Path&gt;&lt;ID info="图片编号"&gt;2&lt;/ID&gt;&lt;Version info="图片版本"&gt;1&lt;/Version&gt;&lt;FileMode info="文件处理模式"&gt;0&lt;/FileMode&gt;&lt;/SOURCE_2&gt;.&lt;/Broadcast&gt;&lt;/VBS_RUNTIME_PARAMS&gt;&lt;/ZAPP&gt;&lt;/ZXML&gt;要设置BROADCAST_VERSION节点的值8为其他值,可参考如下代码(将值加1):用ReplaceChild( TiXmlNode* replaceThis, constTiXmlNode&amp; withThis )方法替换TiXmlDocument doc("zapp.conf");doc.LoadFile();TiXmlHandle docHandle( &amp;doc );TiXmlElement* Broadcast_ver =docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("V BS_RUNTIME_PARAMS").FirstChildElement("BROADCAST_VE RSION").ToElement();TiXmlNode * oldnode = Broadcast_ver-&gt;FirstChild();const char *ver = Broadcast_ver-&gt;GetText();int oldVer = atoi(ver);CString newVer;newVer.Format("%d",oldVer+1);TiXmlText newText(newVer);Broadcast_ver-&gt;ReplaceChild(oldnode,newText);AfxMessageBox(Broadcast_ver-&gt;GetText());//输出值doc.SaveFile();二,删除节点,属性值RemoveChild( TiXmlNode* removeThis )方法删除父节点的子节点,RemoveAttribute( const char * name )方法删除属性值.例如删除BROADCAST_VERSION节点TiXmlHandle docHandle( &amp;doc );TiXmlElement* Broadcast_ver =docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("V BS_RUNTIME_PARAMS").ToElement();TiXmlNode * node = Broadcast_ver-&gt;FirstChild("BROADCAST_VERSION");Broadcast_ver-&gt;RemoveChild(node);也可以删除整个SOURCE_1节点:TiXmlHandledocHandle( &amp;doc );TiXmlElement* Broadcast =docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("V BS_RUNTIME_PARAMS").FirstChild("Broadcast").ToElement();TiXmlNode * node = Broadcast-&gt;FirstChild("SOURCE_1");Broadcast-&gt;RemoveChild(node);删除BROADCAST_VERSION的info属性:TiXmlHandle docHandle( &amp;doc );TiXmlElement* Broadcast_ver =docHandle.FirstChild("ZXML").FirstChild("ZAPP").FirstChild("V BS_RUNTIME_PARAMS").FirstChildElement("BROADCAST_VE RSION").ToElement();Broadcast_ver-&gt;RemoveAttribute("info"); //删除info可以借助NextSiblingElement()方法实现递归删除.三,添加节点,属性值例如在SOURCE_3下添加BROADCAST_PID节点:TiXmlHandle docHandle( &amp;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-&gt;SetAttribute("info","the pid");Broadcast_Pid-&gt;LinkEndChild(text);Broadcast-&gt;LinkEndChild(Broadcast_Pid);将在SOURCE_3后添加新的节点:&lt;BROADCAST_PIDinfo="the pid"&gt;7215&lt;/BROADCAST_PID&gt;四,最后说一下中文乱码的问题乱码是由于GB2312与UTF8之间转换不当造成的,tinyxml 在处理UTF8本身没有问题,当你打开一个UTF8的文档,可以在加载的时候指定UTF8的方式,或者文档声明处指明的编码格式,tinyxml会按照相应的编码格式加载,但很多时候当我们输出或写入中文字段时会出现乱码,无论在内存,还是打印出来的内容.这是因为我们的软件通常是GB2312编码,而读取或写入的内容是UTF8,自然就会出错.可以借助网上的两个函数来实现转换(原作者不详): voidConvertUtf8ToGBK(CString&amp; 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&amp; 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;}。

相关文档
最新文档