TinyXml使用指南
tinyxml用法
![tinyxml用法](https://img.taocdn.com/s3/m/7b912508f011f18583d049649b6648d7c1c70836.png)
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查找唯一节点及修改节点操作](https://img.taocdn.com/s3/m/4dad22d5f605cc1755270722192e453610665bf7.png)
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>它也是没有孩子节点的。
TIXML使用详解
![TIXML使用详解](https://img.taocdn.com/s3/m/efa1f006cc7931b765ce15f5.png)
TiXmlNode* pChild;
TiXmlText* pText; int t = pParent->Type(); printf( "type %d/n", t); int num;
switch ( t ) { case TiXmlNode::DOCUMENT:
<name>TinyXml How To</name> <price unit=”RMB”>20</price> <description>Some words…</description> </ book > 整个文档,对应 TiXmlDocument book,name,price, description,都对应 TiXmlElement 第一行对应一个 TiXmlDeclaration 第二行对应一个 TiXmlComment “TinyXml How To”对应一个 TiXmlText unit 则是 price 的一个 TiXmlAttribute 这些类与 XML 文件中的相应元素都有很好的对应关系,因此相信参照 TinyXml 的文档,可以 很容易的掌握各个方法的使用。 2. 需要注意的问题 各类之间的转换 由于各个节点类都从 TiXmlNode 继承,在使用时常常需要将 TiXmlNode*类型的指针转换为 其派生类的指针,在进行这种转换时,应该首先使用由 TiXmlNode 类提供的一系列转换函数, 如 ToElement(void),而不是 c++的 dynamic_cast。 检查返回值 由于 TinyXml 是一个非校验的解析器,因此当解析一个文件时,很可能文件并不包含我们预 期的某个节点,在这种情况下,TinyXml 将返回空指针。因此,必须要对返回值进行检查, 否则将很容易出现内存访问的错误。 如何重头建立一个 XML 文件 先建立一个 TiXmlDocument 对象,然后,载入某个模板,或者直接插入一个节点作为根节点, 接着就可以像打开一个已有的 XML 文件那样对它进行操作了。
TinyXml使用
![TinyXml使用](https://img.taocdn.com/s3/m/313aa4d63186bceb19e8bbfa.png)
这次使用了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使用笔记与总结
![tinyxml使用笔记与总结](https://img.taocdn.com/s3/m/77eacb0e4431b90d6d85c715.png)
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函数的节点与要查找的节点必须成“父子关系”。
TinyXML(TinyXPath) 使用总结
![TinyXML(TinyXPath) 使用总结](https://img.taocdn.com/s3/m/57a13b67783e0912a2162a8e.png)
原来的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使用指南](https://img.taocdn.com/s3/m/9fd05d2cb42acfc789eb172ded630b1c59ee9b15.png)
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中文指南](https://img.taocdn.com/s3/m/265ba518a8114431b90dd85c.png)
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库使用方法及实例解析](https://img.taocdn.com/s3/m/3021df3c30126edb6f1aff00bed5b9f3f90f7266.png)
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最简单的新手教程
![开源TinyXML最简单的新手教程](https://img.taocdn.com/s3/m/0d6cc302854769eae009581b6bd97f192279bf9f.png)
开源TinyXML最简单的新⼿教程TinyXML它是基于⼀个⾮常受欢迎的现在DOM型号XML解析器,简单易⽤且⼩巧玲珑,很适合存储简单数据。
配置⽂件。
该项⽬属于开源项⽬,在sourceforge上边的链接是:当前最新版本号是2.6.2先看⼀下源代码⽂档的结构:Docs是帮助⽂档。
⾥边有许多的使⽤说明,只截⼀张图看⼀下:详细依据须要再看我们使⽤的是它的库。
能够是静态的也能够是动态库。
我就⽤静态库了,将这⾥边的⼏个头⽂件和源⽂件⼀起创建⼀个project,⽣成Lib库:tinyxml.lib使⽤的时候,将这两个头⽂件以及⽣成的静态库加进去:⼀个简单的样例#include <iostream>using namespace std;#ifdef TIXML_USE_STL#include <iostream>#include <sstream>using namespace std;#else#include <stdio.h>#endif#if defined( WIN32 ) && defined( TUNE )#include <crtdbg.h>_CrtMemState startMemState;_CrtMemState endMemState;#endif#include "tinyxml/tinyxml.h"int main(){TiXmlDocument *pDoc = new TiXmlDocument;if (NULL==pDoc){return false;}TiXmlDeclaration *pDeclaration = new TiXmlDeclaration("1.0","gb2312","");if (NULL==pDeclaration){return false;}pDoc->LinkEndChild(pDeclaration);// ⽣成⼀个根节点TiXmlElement *pRootEle = new TiXmlElement("索引数据包信息");pDoc->LinkEndChild(pRootEle);//头节点TiXmlElement *pHeader = new TiXmlElement("头节点");pRootEle->LinkEndChild(pHeader);TiXmlElement *pCellNode = new TiXmlElement("字段1");pHeader->LinkEndChild(pCellNode);pCellNode->SetAttribute("str1","1状态");pCellNode->SetAttribute("str2","0状态");pDoc->SaveFile("d:\\result.xml");return 0;}结果:临时这⾥边的字符串不能是宽字符的。
tinyxml使用文档
![tinyxml使用文档](https://img.taocdn.com/s3/m/20a18e861b37f111f18583d049649b6649d7095d.png)
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入门教程](https://img.taocdn.com/s3/m/bd5e6e32580216fc700afded.png)
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使用说明](https://img.taocdn.com/s3/m/c7cc5e2c1fb91a37f111f18583d049649b660e9f.png)
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文档中的元素和属性,并对其进行处理。
c++ tinyxml 操作指南
![c++ tinyxml 操作指南](https://img.taocdn.com/s3/m/b84cd68002d276a200292e85.png)
从文件中载入XML将文件载入到TinyXML DOM的最简单方法是:TiXmlDocument doc( "demo.xml" );doc.LoadFile();下面的代码更实用一些,它载入文件并在STDOUT里显示内容:// 载入文件并输出到STDOUTvoid dump_to_stdout(const char* pFilename){TiXmlDocument doc(pFilename);bool loadOkay = doc.LoadFile();if (loadOkay){printf(" %s: ", pFilename);dump_to_stdout( &doc ); // 此函数在后文定义}else{printf("Failed to load file \"%s\" ", pFilename);}}在main函数中使用这个函数的简单示例:int main(void){dump_to_stdout("example1.xml");return 0;}你可以用这个XML来测试上面的代码:<?xml version="1.0" ?><Hello>World</Hello>这段程序会在控制台中输入如下信息:DOCUMENT+ DECLARATION+ ELEMENT Hello+ TEXT[World]dump_to_stdout函数定义在本文后面,你可以参考它来了解怎样递归遍历DOM。
用代码生成XML文件下面的代码可以生成上例中的XML文件:void build_simple_doc( ){// Make xml: <?xml ..><Hello>World</Hello>TiXmlDocument doc;TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" ); TiXmlElement * element = new TiXmlElement( "Hello" );TiXmlText * text = new TiXmlText( "World" );element->LinkEndChild( text );doc.LinkEndChild( decl );doc.LinkEndChild( element );doc.SaveFile( "madeByHand.xml" );生成的XML文件与之前“拷贝\粘贴”的文件没有区别,同样可以被dump_to_stdout函数处理:dump_to_stdout("madeByHand.xml"); // 此函数在后文定义并且输出同样的结果:madeByHand.xml:Document+ Declaration+ Element [Hello]+ Text: [World]下面这个代码生成完全一样的XML DOM,只是改变了一下节点的生成和链接顺序:void write_simple_doc2( ){// 与write_simple_doc相同,只是尽早链接节点而已TiXmlDocument doc;TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );doc.LinkEndChild( decl );TiXmlElement * element = new TiXmlElement( "Hello" );doc.LinkEndChild( element );TiXmlText * text = new TiXmlText( "World" );element->LinkEndChild( text );doc.SaveFile( "madeByHand2.xml" );}属性为给定的节点设置属性很简单:window = new TiXmlElement( "Demo" );window->SetAttribute("name", "Circle");window->SetAttribute("x", 5);window->SetAttribute("y", 15);window->SetDoubleAttribute("radius", 3.14159);如果愿意,你也可以使用TiXmlAttribute对象。
TinyXML(TinyXPath) 使用总结
![TinyXML(TinyXPath) 使用总结](https://img.taocdn.com/s3/m/57a13b67783e0912a2162a8e.png)
原来的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之间是并列关系。
TinyXML2使用教程
![TinyXML2使用教程](https://img.taocdn.com/s3/m/63bad86acec789eb172ded630b1c59eef8c79aaa.png)
TinyXML2使用教程一、TinyXML2的安装```$ make```编译完成后,会在当前目录下生成一个名为libtinyxml2.a的库文件,将其复制到您的开发环境中的库文件夹中即可。
二、读取XML文件在开始使用TinyXML2进行读取XML文件之前,需要在您的代码中包含TinyXML2的头文件:```#include <tinyxml2.h>```要读取一个XML文件,首先需要创建一个XML文档对象,并调用它的LoadFile(方法来加载XML文件:```tinyxml2::XMLDocument doc;doc.LoadFile("example.xml");```如果加载成功,可以通过调用根节点的FirstChildElement(方法来获取XML文件的根元素:```tinyxml2::XMLElement* root = doc.FirstChildElement("root");```然后可以使用root指针来访问根元素的属性和子元素:```const char* rootValue = root->GetText(; // 获取根元素的文本值tinyxml2::XMLElement* child = root->FirstChildElement("child"); // 获取根元素的名为"child"的第一个子元素const char* childValue = child->GetText(; // 获取子元素的文本值```还可以使用循环来遍历根元素的所有子元素:```for (tinyxml2::XMLElement* child = root->FirstChildElement(; child; child = child->NextSiblingElement()const char* childName = child->Name(; // 获取子元素的名称const char* childValue = child->GetText(; // 获取子元素的文本值}```三、修改XML文件使用TinyXML2库可以很方便地修改XML文件。
(转)XML解析器(TinyXML)的使用
![(转)XML解析器(TinyXML)的使用](https://img.taocdn.com/s3/m/a0cdad41777f5acfa1c7aa00b52acfc789eb9fba.png)
(转)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.编译运⾏。
关于tinyxml在LINUX环境下的使用
![关于tinyxml在LINUX环境下的使用](https://img.taocdn.com/s3/m/212dd06c7275a417866fb84ae45c3b3567ecdd0c.png)
关于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)。
C++使用TinyXML解析XML文件
![C++使用TinyXML解析XML文件](https://img.taocdn.com/s3/m/b52c762b4a35eefdc8d376eeaeaad1f34793115d.png)
C++使⽤TinyXML解析XML⽂件1.介绍 读取和设置xml配置⽂件是最常⽤的操作,TinyXML是⼀个开源的解析XML的C++解析库,能够在Windows或Linux中编译。
这个解析库的模型通过解析XML⽂件,然后在内存中⽣成DOM模型,从⽽让我们很⽅便的遍历这棵XML树。
下载TinyXML的⽹址: 使⽤TinyXML只需要将其中的6个⽂件拷贝到项⽬中就可以直接使⽤了,这六个⽂件是:tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。
2.读取XML⽂件如读取⽂件a.xml:<ToDo><Item priority="1"><bold>Book store!</bold></Item><Item priority="2">book1</Item><Item priority="2">book2</Item></ToDo>读取代码如下:1 #include "tinyxml.h"2 #include <iostream>3 #include <string>45using namespace std;67enum SuccessEnum {FAILURE, SUCCESS};89 SuccessEnum loadXML()10 {11 TiXmlDocument doc;12if(!doc.LoadFile("a.xml"))13 {14 cerr << doc.ErrorDesc() << endl;15return FAILURE;16 }1718 TiXmlElement* root = doc.FirstChildElement();19if(root == NULL)20 {21 cerr << "Failed to load file: No root element." << endl;22 doc.Clear();23return FAILURE;24 }2526for(TiXmlElement* elem = root->FirstChildElement(); elem != NULL; elem = elem->NextSiblingElement())27 {28string elemName = elem->Value();29const char* attr;30 attr = elem->Attribute("priority");31if(strcmp(attr,"1")==0)32 {33 TiXmlElement* e1 = elem->FirstChildElement("bold");34 TiXmlNode* e2=e1->FirstChild();35 cout<<"priority=1\t"<<e2->ToText()->Value()<<endl;3637 }38else if(strcmp(attr,"2")==0)39 {40 TiXmlNode* e1 = elem->FirstChild();41 cout<<"priority=2\t"<<e1->ToText()->Value()<<endl;42 }43 }44 doc.Clear();45return SUCCESS;46 }4748int main(int argc, char* argv[])49 {50if(loadXML() == FAILURE)51return1;52return0;53 }View Code3.⽣成XML⽂件如⽣成⽂件b.xml如下所⽰:<root><Element1 attribute1="some value" /><Element2 attribute2="2" attribute3="3"><Element3 attribute4="4" />Some text.</Element2></root>⽣成上⾯b.xmlL⽂件代码如下:1 #include "tinyxml.h"2 #include <iostream>3 #include <string>4using namespace std;56enum SuccessEnum {FAILURE, SUCCESS};78 SuccessEnum saveXML()9 {10 TiXmlDocument doc;1112 TiXmlElement* root = new TiXmlElement("root");13 doc.LinkEndChild(root);1415 TiXmlElement* element1 = new TiXmlElement("Element1");16 root->LinkEndChild(element1);1718 element1->SetAttribute("attribute1", "some value");192021 TiXmlElement* element2 = new TiXmlElement("Element2"); ///元素22 root->LinkEndChild(element2);2324 element2->SetAttribute("attribute2", "2");25 element2->SetAttribute("attribute3", "3");262728 TiXmlElement* element3 = new TiXmlElement("Element3");29 element2->LinkEndChild(element3);3031 element3->SetAttribute("attribute4", "4");3233 TiXmlText* text = new TiXmlText("Some text."); ///⽂本34 element2->LinkEndChild(text);353637bool success = doc.SaveFile("b.xml");38 doc.Clear();3940if(success)41return SUCCESS;42else43return FAILURE;44 }4546int main(int argc, char* argv[])47 {48if(saveXML() == FAILURE)49return1;50return0;51 }View Code4.重要函数或类型的说明 (1)FirstChildElement(const char* value=0):获取第⼀个值为value的⼦节点,value默认值为空,则返回第⼀个⼦节点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TinyXml使用指南(1) 作者:tamsyn 来源: 时间:2006-8-16 【字体:大中小】〖双击滚屏〗在这里我们并不是要讲解如何使用XML,或在网页中使用它。
而是要在C/C++中使用它。
详细一点就是在C/C++嵌套使用XML文件。
要在C/C++中使用XML文件,你就必须需要一个能分析XML文件的函数库。
在这方面有很多,比如libxml2,tinxml,expat等等很多。
而我使用的是tinyxml,为什么要使用它呢?因为它很小巧,只有两个头文件和四个CPP文件。
正如作者在tinyxml官方文件中所说的,如果你不是想在浏览器中使用XML,那么tinyxml非常适合你。
我们下面来看一下tinyxml是如何在C/C++中建立XML文件的。
char floader[200],buffer[200];TiXmlDocument* m_xmlDoc = new TiXmlDocument();TiXmlElement xElement("player");sprintf(buffer,"%d", 1);xElement.SetAttribute("admin", buffer);TiXmlElement xPos("pos");sprintf(buffer,"%d",2);xPos.SetAttribute("x", buffer);sprintf(buffer,"%d",3);xPos.SetAttribute("y", buffer);sprintf(buffer,"%d",4);xPos.SetAttribute("zone", buffer);xElement.InsertEndChild(xPos);m_xmlDoc->InsertEndChild(xElement);sprintf(floader,"%s.xml", "antking");m_xmlDoc->SaveFile(floader);delete m_xmlDoc;这段简单的代码的作用就是将用户数据保存在XML文件中。
不同的是我对其做了一些简化。
这段代码的作用就是先建立一个XML文件句柄。
TiXmlDocument* m_xmlDoc = new TiXmlDocument();然后建立一个成员。
TiXmlElement xElement("player");sprintf(buffer,"%d", 1);xElement.SetAttribute("admin", buffer);然后再建立一个成员。
TiXmlElement xPos("pos");sprintf(buffer,"%d",2);xPos.SetAttribute("x", buffer);sprintf(buffer,"%d",3);xPos.SetAttribute("y", buffer);sprintf(buffer,"%d",4);xPos.SetAttribute("zone", buffer);这个成员包含3个属性。
接下来是将这个成员连接成上一个成员的子结点。
xElement.InsertEndChild(xPos);然后再把上一个结点连接成为XML文件的子结点。
m_xmlDoc->InsertEndChild(xElement);最后保存这个文件。
sprintf(floader,"%s.xml", "antking");m_xmlDoc->SaveFile(floader);释放句柄。
delete m_xmlDoc;这就是创建XML文件的过程。
这段代码将产生一个文件,文件内容如下:<pos x="2" y="3" zone="4" ></pos x="2" y="3" zone="4" >它产生的结构可以用一棵树来表示,见下图:接下来,我们看一下如何从上面这个XML文件中读出数据。
char floader[200],buffer[200];TiXmlDocument* m_xmlDoc;int admin1,x1,y1,z1;sprintf(floader,"%s.xml", "antking");m_xmlDoc = new TiXmlDocument(floader);if (m_xmlDoc->LoadFile()){TiXmlElement *xPlayer = 0;xPlayer = m_xmlDoc->FirstChildElement("player");if (xPlayer){if (xPlayer->Attribute("admin"))admin1= (bool)atoi(xPlayer->Attribute("admin"));TiXmlElement *xZone = 0;xZone = xPlayer->FirstChildElement("pos");x1 = (int)atoi(xZone->Attribute("x"));y1 = (int)atoi(xZone->Attribute("y"));z1 = (int)atoi(xZone->Attribute("zone"));}}delete m_xmlDoc;printf("%d,%d,%d,%d",admin1,x1,y1,z1);这段代码的意思就是,先建立一个文件句柄,如果句柄建立成功就打开一个XML文件。
XML 文件打开后,先得到它的第一个子结点,如果子结点存在,得到这个结点的属性。
然后又打开这个结点的第一个子结点,读出其中的数据。
最后关闭文件句柄。
#include "iostream"#include "fstream"#include "tinyxml.h"using namespace std;int main(){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();//////////////////////////////////////////////////////////////////////////if(!doc->Parse(buffer)){cout << doc->ErrorDesc() << endl;}const TiXmlElement* root = doc->RootElement();for( const TiXmlNode* child = root->FirstChild();child;child=child->NextSibling()){OutputDebugStringA(child->Value());/*生成一个StaticBox*/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;}}}cout << "\n";cout << "\tPosition = (" << px << ", " << py << ", " << pz << ")\n"; cout << "\tDimension = (" << dx << ", " << dy << ", " << dz << ")\n\n"; }}delete doc;getchar();return 0;}然后在项目的文件夹中加入一个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" /></staticbox><staticbox mesh="crate.mesh"><position x="3" y="2" z="4" /><dimension x="2" y="4" z="2" /></staticbox> </Scene>。