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 指南这是什么?这份指南有一些关于如何有效地使用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库使用方法及实例解析

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在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使用文档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(方法获取第一个子元素,然后使用一个循环遍历所有同级元素。

TinyXML入门教程

TinyXML入门教程

TinyXML入门教程 1什么是XML? 1文档类 2创建文档对象 3输出文档对象 3保存文档对象 4返回第一个根元素 5声明类 5注释类 6元素类 6节点名 6父节点 6子节点 7编辑子节点 7同级节点 7遍历元素 8元素属性 8元素函数总结 9属性类 10文章下载源代码下载什么是XML?XML全称EXtensible Markup Language,翻译为可扩展标记语言,简而言之就是你可以自定义数据的标识,以此来区分各种不同的数据,以便于进行数据交换,例如html就可以理解为一种简单的xml语言。

XML文件通常就是一个文本文件,可以使用任何编码上图就是我系统中一个xml文件的图标,使用VC2005打开它,你可以看到如下内容:XML也是有这几个对象组成了,一般来说我们经常使用的类如下:l TiXmlDocument:文档类,它代表了整个xml文件。

l TiXmlDeclaration:声明类,它表示文件的声明部分,如上图所示。

l TiXmlComment:注释类,它表示文件的注释部分,如上图所示。

l TiXmlElement:元素类,它是文件的主要部分,并且支持嵌套结构,一般使用这种结构来分类的存储信息,它可以包含属性类和文本类,如上图所示。

n TiXmlAttribute/TiXmlAttributeSet:元素属性,它一般嵌套在元素中,用于记录此元素的一些属性,如上图所示。

n TiXmlText:文本对象,它嵌套在某个元素内部,如上图所示。

TinyXml使用文档对象模型(DOM)来解析xml文件,这种模型的处理方式为在分析时,一次性的将整个XML文档进行分析,并在内存中形成对应的树结构,同时,向用户提供一系列的接口来访问和编辑该树结构。

这种方式占用内存大,但可以给用户提供一个面向对象的访问接口,对用户更为友好,非常方便用户使用。

下面我们依次来介绍各个类的用法。

文档类文档类代表一个XML文档,通过它,你可以保存,载入和打印输出文档。

TinyXml使用说明

TinyXml使用说明

TinyXml使用说明1. 安装和引入TinyXml库2.创建XML文档使用TinyXml,你可以创建一个XML文档对象。

首先,包含头文件`tinyxml.h`。

```cpp#include "tinyxml.h"```然后,通过使用 `TiXmlDocument` 类来创建一个XML文档对象。

```cppTiXmlDocument doc;```3.加载和保存XML文档一旦你创建了一个XML文档对象,你就可以加载一个XML文件或字符串,并将其保存为XML文件。

-加载XML文件:```cppbool loadSuccess = doc.LoadFile("example.xml");if (loadSuccess)//文件加载成功,可以对其进行处理} else//文件加载失败,进行错误处理}```-加载XML字符串:```cppconst char* xmlString ="<root><element>value</element></root>";bool loadSuccess = doc.Parse(xmlString);if (loadSuccess)//字符串解析成功,可以对其进行处理} else//字符串解析失败,进行错误处理}```-保存XML文档:```cppdoc.SaveFile("output.xml");```4.获取XML元素使用TinyXml,你可以获取XML文档中的元素和属性。

首先,你需要获取XML文档的根元素。

```cppTiXmlElement* root = doc.RootElement(;```接下来,你可以使用 `TiXmlElement` 类的成员函数来获取元素的名称、值和属性。

-获取元素的名称和值:```cppconst char* elementName = root->Value(;const char* elementValue = root->GetText(;```-获取元素的属性:```cppconst char* attributeName = root->Attribute("name");```5.遍历XML元素使用TinyXml,你可以遍历XML文档中的元素和属性,并对其进行处理。

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之简单应用
// Get name itemElement = itemElement->FirstChildElement(); itemText = itemElement->FirstChild()->ToText(); name = itemText->Value();
// Get level itemElement = itemElement->NextSiblingElement(); itemText = itemElement->FirstChild()->ToText(); level = atoi( itemText->Value() );
Copyright © 2005, 9F Studio
TinyXML 之简单应用
<!-- This is comment here. --> 文档的注释,转化为 TiXmlComment <Data> 这个标签对应于一个 TiXmlElement,其没有具体的属性(attribute),而是含有另外两个 child(<Player>)。 <Player level="12"> 这个就是<Data>的 child,也是一个 TiXmlElement 元素,它具有一个属性(属性名为 level, 值为 12) Kasi 这是<Player level="12">的 child,为一个 TiXmlText。其为叶节点(leaf node),即不再 含有其他的 child。
if ( !loadOkay ) {
printf( "Could not load 'demotest.xml': Error='%s'.\n", InputDoc.Error}

使用TinyXml库值得注意的几个地方

使用TinyXml库值得注意的几个地方

使用TinyXml库值得注意的几个地方/hoyt00/article/details/6769883这两天仔细看了下TinyXml的源代码, 完美地搞清楚了一些网友和我自己的很多疑问. 鉴于TinyXml的实用性, 而且现在不少人在使用, 就决定在此做点有意义的事情---- 列出使用TinyXml库值得注意的几个地方.关于TinyXml库的介绍网上有很多资料, 大家可以试着搜下, 这里我就不多说了, TinyXml 很小巧, 但它提供了非常丰富的接口, 特别适用于存取程序的数据, 如果你使用它, 相信你会感觉到它的灵活的.TinyXml下载地址: /detail/hoyt00/3904805/projects/tinyxml/以下几点值得注意哦:1.new出指针而不见delete.如果你看了TinyXml的文档或者一些网友写的例子程序, 你会发现, 其中new出了很多对象而不见一个delete, 这个问题我当时也感觉特别难以接受, 网上也有各种各样的说法, 有说"nwe出这么多, 内存不泄漏才怪", 有说"TinyXml的指针有自销毁功能"等等, 这些说法都是错误的, 只要你正确的使用TinyXml, 无论你new多少(当然在内存的有效使用范围之内)都不会有内存泄漏, 而且TinyXml 的指针根本没有自销毁功能, 可以想像一下, 在C++中一个没有经过任何类的包装的指向堆内存的指针变量怎么可能在它自身的生命结束时管得了它所指向的对象? 那它到底是怎么回事?我们都知道(这里我假设你已经看过TinyXml文档), TinyXml是利用DOM(文档对象模型)来呈现XML文档的, 在它眼中XML文档就是一棵树, TiXmlDocument对象就是这棵树的根结点, 在一个完整的文档中, 除了它, 其余结点必须都是它的后代, 所以TinyXml用了一个很巧妙的方法来析构每一个结点所对应的对象---- 每个结点的析构任务都委托给了它的父亲, 这样只要保证父亲被正确析构,或者调用了父亲的Clear函数, 它的所有后代都会被正确的析构,所以对整个文档来说只要TiXmlDocument对象被正确析构,那就万无一失了, 这棵树会先从叶子销毁, 一直到树根. 像这种数据结构, 为了保证树的完整性而使用堆内存, 和由它自己管理内存也是理所当然的, 由此便可得到以下几个结论:(1)TiXmlDocument对象最好在栈上创建, 如果在堆上创建了, 那你必须得自己销毁它, 千万不要像别的对象一样new出了就不管了.(2)除了TiXmlDocument对象, 树中的别的结点对象, 必须是堆上创建的, 千万不要把栈上对象的地址链接(LinkEndChild)到树中, 因为栈上对象是不能用delete销毁的, 当然TinyXml也有对栈上对象插入的方法, 以下会说到.(3) 除了文档结点, new出的所有结点对象必须被链接到一个父亲结点上, 才可以不用管对象的delete, 而且必须不能管, 不然有可能整棵树会被破坏而得不到正确的遍历和析构, 如果new出的对象从来没链接到某棵树上, 而且将来也不打算链接, 无论有没有别的结点链接到它身上, 你都必须手动delete它.(4)不要尝试链接已经被别的结点链接过的指针, 很显然, 这会造成无法估量的麻烦, 不用多说, 大家都懂的.2.Insert vs. Link.当然不是所有人都喜欢new, 可能他们更喜欢像std::vector那样插入元素的副本而不是交给它一个指针, TinyXml也提供了同样的方式插入结点---- Insert函数(InsertEndChild, InsertBeforeChild, InsertAfterChild), 因为这些函数插入的是结点的副本(包括所有子结点) ,所以可以传给它栈上或堆上的对象, 但是要注意, 如果传入的是堆上对象, 那还必须手动delete它, 而不像LinkEndChild那样链接了就不能管了, 因为树析构的时候析构的是它的副本,而不是它. 我更倾向于使用Link + 堆上对象, 而不Insert + 栈上对象, 因为这样可以省去创建副本的运行成本, 除非要插入到具体的位置, 而不是End, 当然也可以修改源代码使Link函数也有这种功能.3.元素的属性不是普通结点.与文本对象(TiXmlText)不同, 属性对象(TiXmlAttribute)在文档树中不是以普通结点形式存在的, 也不从TiXmlNode类派生, 而是被元素结点的数据成员---- 一个TiXmlAttributeSet对象所管理, 这个TiXmlAttributeSet对象持有一个环状的TiXmlAttribute对象链表(具体可以参看源代码), 所以TiXmlElement对象通过调用Child系列函数是无法得到属性的, 相反这件事是通过Attribute系列函数完成的. 访问器(从TiXmlVisitor派生的用户实现的类对象, 一种附加的回调机制, 具体参看源代码)没有针对TiXmlAttribute对象的接口, 而必须在对TiXmlElement 对象的实现中处理属性, 因此TiXmlAttribute类也没有Accept虚函数.4.尽量不要在xml中使用中文.TinyXml只认识UTF-8和ISO 8859-1编码, 而不知GB2312为何物, 但事实上你以GB2312在文档中写入中文, 之后可以正确读取, 而且文档在记事本中打开也能显示正确的中文, 其实这是种巧合, 并不是TinyXml支持GB2312了.这个问题需要解释下, 我已经仔细分析过了, TinyXml的函数有char*类型参数, 而没有wchar_t*类型参数, 所以直接在程序中向文档写入中文必然是GB2312方式(这里是以VC编译器为例的), 这时char*只是指向一块内存块, 跟void*一样, 这块内存只有用GB2312才能正确解释为中文, 因为TinyXml是被设计跨平台的, 所以不要指望它会调用WideCharToMultiByte和MultiByteToWideChar来帮你做转换, 而以GB2312写入的中文在读取时这些中文字符的码值是不变的, 也就是你在准备写入文档时是码值是多少, 读取到程序里的值就是多少, 而把这个值当作GB2312编码时就是原来写文档时的中文字符了, 当把写入的文档在记事本打开时, 由于没有utf-8标记字节0xEF 0xBB0xBF(TinyXml默认不写入这三个字节, 稍后再说怎么让它写入), 所以记事本把xml文件当作GB2312编码打开, 就阴差阳错地把原本错误的字节以正确的中文字符显示了, 但终究这篇xml文档是utf-8编码的, 那些中文字符本应显示为乱码的, 就这样错误的写入, 错误的读取, 记事本错误的判断, 都加到一起就离奇地没有错误了.但错误还是错误, 有一个办法, 就是在文档头部加上utf-8标记字节0xEF0xBB 0xBF, 这样记事本就能正确判断文档编码, 正确地以utf-8打开, 正确地把中文显示为乱码.基于这几种错误叠加的现象, 如果你生成的xml文档只用在你自己特定的程序中而不用在其它软件(比如有时要用别的文本处理软件打开查看内容), 那么在文档中存取中文是完全没有问题的, 但在别的地方以utf-8打开时中文就是乱码.保证所有地方都正确的方法是在写入时和读取时用WideCharToMultiByte和MultiByteToWideChar把GB2312编码的中文字串转换为UTF-8编码的中文字串, 如此, 所有软件都能正确的读取UTF-8编码的中文字符(为了让记事本正确的判断为UTF-8, 可以加上utf-8标记字节, 虽然它不是标准, 但普遍使用).当然还是那句话---- 尽量不使用中文和其它非英文字符, 除非迫不得已.另外我在看源代码时, 有几个地方也发表下自己的想法:1.关于explicit关键字tinystr.h第85行TIXML_EXPLICIT TiXmlString ( const char * str, size_typelen) :rep_(0)(TIXML_EXPLICIT宏的内容是explicit) explicit关键字的作用是使单参数的构造函数不用作隐式转换, 但这个构造函数有两个参数, 很显然, 它根本就没有发生隐式转换的可能, 也完全没有必要使用explicit关键字.2.关于成员函数const和非constTinyXml的类库中有许多类的函数有const和非const版本, 为什么非const版本的函数不把函数体重新写一遍而是用const_cast把const函数的const性质转换掉再调用它呢? 其实函数体也就返回数据成员的那一两句而已.3.关于默认实参有些类的重载成员函数们, 一个函数的参数表和另一个函数的参数表的前面部分完全一致, 为什么不使用默认实参而是参数较少的函数版本调用参数较多的函数版本呢?4.关于Test项目中的乱码这也是很多人都疑惑的一个问题---- TinyXml库自带Test项目竟然编译不过, 这个问题的原因很简单, 打开xmltest.cpp文件, 定位到第1141行, 你会发现, 该行和下面几行有乱码, 这又是怎么回事?其实这几行是作者为测试ISO 8859-1编码(一种单字节编码, 编码范围使用了8位的所有取值, 也就是0到0xFF)文档而写, 意图把ISO 8859-1字符串写入文档对象, 再从文档对象读取, 只有用ISO 8859-1编码才能正确解释.但是编译器以GB2312打开cpp文件时遇到这几个字符就发生了奇怪的事情---- 源码变乱码了. 本来乱码没什么的, 大不了我输出到xml文件也乱码就是了, 但问题是那几个字符不仅使它本身乱, 而且它后面的一个asc2字符也有50%的几率跟着遭殃, 因为我们都知道用GB2312解码字符串时如果第一个字节大于0x7F, 一般情况下会把它和接下来的一个字节当作一个整体字符, 当然这个字符可能显示, 也可能不显示, 无论怎样都不是正确的, 所以你会看到那些字串中有用于xml元素的"<"符号而没有">"符号, 有的字串甚至都没反引号, 这时不要简单的加上反引号, 虽然语法正确了, 能编译, 但xml语法还没纠正, 调试时会导致文档对象里的断言失败而退出. 另外我还查看了这几个乱码字符的二进制值:其中二进制值省略了行首的空白字符, GB2312的括号中两个字节表示被当作的一个整体,ISO 8859-1表示原本用ISO 8859-1编码时显示的字串. 可以看出以ISO 8859-1编码的文本是完全符合C++语法和xml语法的, 大家在生成项目时将这块代码注释掉就能通过编译和调试了.还有刚才提到TinyXml保存文档时默认不写入utf-8标记字节BOM, 如果想让它保存时写入这三个字节, 可以修改TiXmlDocument类添加一个成员:[cpp]view plaincopy1.public:2. void SetMicrosoftBOM(bool _useBOM) {useMicrosoftBOM = _useBOM;}当然也可以修改别的成员函数, 比如给SaveFile函数添加一个bool参数_useBOM等等, 看个人爱好了.关于TinyXml的使用就先写到这了, 如果有不对的地方, 希望大家指出, 如果有不明白的地方也可以联系我!。

(转)XML解析器(TinyXML)的使用

(转)XML解析器(TinyXML)的使用

(转)XML解析器(TinyXML)的使⽤1.⾸先下载TinyXML库的⽂件,这⾥给出链接/tinyxml/tinyxml_2_3_4.zip?download2.下载后解压这个压缩包,把所有的东西放到⼀个找的着的地⽅(⽐如,E:\开发库\TinyXML)3.⽤Visual C++(推荐VC++.NET2003)创建⼀个新的⼯程(Win32控制台)4.在TinyXML的⽬录⾥⾯找到tinystr.h, tinyxml.h, tinystr.cpp, tinyxml.cpp, tinyxmlerror.cpp, tinyxmlparser.cpp六个⽂件加⼊到刚刚创建的项⽬中去5.打开tinyxml.h, 在第⼀⾏加⼊下⾯这⾏:#define TIXML_USE_STL //标志使⽤STL的内容6.然后创建⼀个cpp⽂件,输⼊下⾯的内容:#include<iostream>#include<fstream>#include"tinyxml.h"using namespace std;int_tmain(int argc, _TCHAR* argv[]){//原先代码是直接加载XML⽂件,我作了⼀下修改,把内容读到字符串后再解析,实际使⽤时就去掉读取XML⽂件这⼀步string filename = "first.xml";//TiXmlDocument* doc = new TiXmlDocument(filename.c_str());////////////////////////////////////////////////////////////////////////////在这⾥复制⽂件//////////////////////////////////////////////////////////////////////////std::ifstream ifs(filename.c_str());char buffer[1024];char c, *p = buffer;while(ifs.get(c)){*p++=c;}*p = 0;ifs.close();////////////////////////////////////////////////////////////////////////////这⾥开始从字符串中解析XML//创建TiXmlDocument对象TiXmlDocument* doc = new TiXmlDocument();//解析if(!doc->Parse(buffer)){cout << doc->ErrorDesc() << endl;}//获取根节点const TiXmlElement* root = doc->RootElement();//循环获取该根节点下⾯的节点for( const TiXmlNode* child = root->FirstChild();child;child=child->NextSibling()){//判断为元素类型并且是staticbox元素,Value()获取该标签的名称if((child->Type() == TiXmlNode::ELEMENT) && (!strcmp(child->Value(),"staticbox"))){const TiXmlElement *box = (const TiXmlElement*)child;double px, py, pz;double dx, dy, dz;//获取属性值std::string mesh;mesh = box->Attribute("mesh");//继续循环获取⼦节点相关数据for(const TiXmlNode *sub_tag = box->FirstChild(); sub_tag; sub_tag = sub_tag->NextSibling() ){if(sub_tag->Type() == TiXmlNode::ELEMENT){const TiXmlElement *sub_element = (const TiXmlElement*)sub_tag;if(!strcmp(sub_tag->Value(),"position")){px = (sub_element->Attribute("x",&px))?px:0.0;py = (sub_element->Attribute("y",&py))?py:0.0;pz = (sub_element->Attribute("z",&pz))?pz:0.0;}else if(!strcmp(sub_tag->Value(),"dimension")){dx = (sub_element->Attribute("x",&dx))?dx:1.0;dy = (sub_element->Attribute("y",&dy))?dy:1.0;dz = (sub_element->Attribute("z",&dz))?dz:1.0;}else if(!strcmp(sub_tag->Value(),"test")){//使⽤GetText()⽅法来获取该标签的值,如这⾥获取的是test的值1和2//string temp = sub_element->GetText();这⾥有些错,所以注释去}}}cout << "<StaticBox>\n";cout << "\tPosition = (" << px << ", " << py << ", " << pz << ")\n";cout << "\tDimension = (" << dx << ", " << dy << ", " << dz << ")\n\n"; }}delete doc;getchar();return 0;}7.然后在项⽬的⽂件夹中加⼊⼀个xml⽂件,取名为first.xml,如下: <?xml version="1.0" encoding="utf-8" ?><Scene><staticbox mesh="crate.mesh"><position x="-8" y="2" z="4" /><dimension x="2" y="4" z="2" /><test>1</test></staticbox><staticbox mesh="crate.mesh"><position x="3" y="2" z="4" /><dimension x="2" y="4" z="2" /><test>2</test></staticbox></Scene>8.编译运⾏。

[库][c++]tinyxml2使用小结

[库][c++]tinyxml2使用小结

17.
while(surfaceChild)
18.
{
19.
content=surfaceChild->GetText();
20.
surfaceChild=surfaceChild->NextSiblingElement();
21.
cout<<content<<endl;
22.
}
23.
surface=surface->NextSiblingElement();
15.
const XMLAttribute *attributeOfSurface = surface->FirstAttribute();
16.
cout<< attributeOfSurface->Name() << ":" << attributeOfSurface->Value() << endl;
10. XMLElement *surface=scene->FirstChildElement("node");
11. while (surface)
12. {
13.
XMLElement *surfaceChild=surface->FirstChildElement();
14.
const char* content;
2.HelloWorld 在项目中创建test.xml,内容如下:
[html]
1. <?xml version="1.0"?> 2. <Hello>World</Hello> 创建main.cpp
  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;}。

相关文档
最新文档