求TinyXML的使用实例

时间:2021-12-07 17:27:53
要读写XML的小程序~~就用TinyXML~~
官网上那个下载以后不能用,有错误~~
谁用过TinyXML给我发一份好吗~~
walter2006@163.com

14 个解决方案

#1


,tinyxml很好用的,下载下来的例子就可以

#2


http://www.360doc.com/showWeb/0/31/495795.aspx

#3


[转]
在这里我们并不是要讲解如何使用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文件的过程。这段代码将产生一个文件,文件内容如下:



它产生的结构可以用一棵树来表示,见下图:


 

 

 

 

 

 

 

 

 

 

 

 

 

接下来,我们看一下如何从上面这个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文件打开后,先得到它的第一个子结点,如果子结点存在,得到这个结点的属性。然后又打开这个结点的第一个子结点,读出其中的数据。最后关闭文件句柄。

#4


1、下载tinyxml
tinyxml,自己在里面找找
解压后包括两部分,tinyxml和一个静态链接库文件xmladapter.lib
2、使用tinyxml通常需要把它包含到自己的工程文件中去,可是你也可以选择以下的方式:
a、project->settings->选项卡link->category选择input->objects/library modules下添加xmladapter.lib;在addtional library path 下添加xmladapter路径
b、工程中包含以下头文件
#include "TinyXml/tinystr.h"
#include "TinyXml/tinyxml.h"
3、这用就可以开始使用tinyxml开始操作xml文件了,具体的操作方式:
    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的一些操作。
     那我们如何使用这些类以及他们的方法来操纵我们的XML呢?请看下面。
    一、读取XML(假设我们的Xml文档中的内容与上面的Xml内容一样)
    //创建一个XML的文档对象。
     TiXmlDocument *myDocument = new TiXmlDocument("填上你的Xml文件名");
    myDocument->LoadFile();
    //获得根元素,即Persons。
     TiXmlElement *RootElement = myDocument.RootElement();
    //输出根元素名称,即输出Persons。
     cout << RootElement->Value() << endl;
    //获得第一个Person节点。
     TiXmlElement *FirstPerson = RootElement->FirstChildElement();
    //获得第一个Person的name节点和age节点和ID属性。
     TiXmlElement *NameElement = FirstPerson->FirstChildElement();
     TiXmlElement *AgeElement = NameElement->NextSiblingElement();
     TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
    //输出第一个Person的name内容,即周星星;age内容,即20;ID属性,即1。
     cout << NameElement->FirstChild()->Value << endl;
     cout << AgeElement->FirstChild()->Value << endl;
     cout << IDAttribute->Value() << endl;
    
     看,读取XML是不是很简单阿,和Java的XML解析库非常的相似,就是名字改了一下而已。
    二、生成XML内容
    //创建一个XML的文档对象。
     TiXmlDocument *myDocument = new TiXmlDocument();
    //创建一个根元素并连接。
     TiXmlElement *RootElement = new TiXmlElement("Persons");
     myDocument->LinkEndChild(RootElement);
    //创建一个Person元素并连接。
     TiXmlElement *PersonElement = new TiXmlElement("Person");
     RootElement->LinkEndChild(PersonElement);
    //设置Person元素的属性。
     PersonElement->SetAttribute("ID", "1");
    //创建name元素、age元素并连接。
     TiXmlElement *NameElement = new TiXmlElement("name");
     TiXmlElement *AgeElement = new TiXmlElement("age");
     PersonElement->LinkEndChild(NameElement);
     PersonElement->LinkEndChild(AgeElement);
    //设置name元素和age元素的内容并连接。
     TiXmlText *NameContent = new TiXmlText("周星星");
     TiXmlText *AgeContent = new TiXmlText("20");
     NameElement->LinkEndChild(NameContent);
     AgeElement->LinkEndChild(AgeContent);
    //保存到文件
     myDocument->SaveFile("要保存的xml文件名");
     这样,便创建了一个如下的xml文件:
    <Persons>
         <Person ID="1">
             <name>周星星</name>
             <age>20</age>
         </Person>
     </Persons>

#5


第二个例子:
1.加载文件。
TiXmlDocument doc( "demo.xml" );
doc.LoadFile();
2.
void main(void)
{
 TiXmlDocument doc("example1.xml");
 bool loadOkay = doc.LoadFile();
 if (loadOkay)
 {
  printf("\n%s:\n", pFilename);
  dump_to_stdout( &doc ); // defined later in the tutorial
 }
 else
 {
  printf("Failed to load file \"%s\"\n", pFilename);
 }
 return;
}
example1.xml 的内容如果是:
<?xml version="1.0" ?>
<Hello>World</Hello>
输出为:
DOCUMENT
+ DECLARATION
+ ELEMENT Hello
  + TEXT[World]
3.建立文档的方法.
void build( )
{               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( "example1.xml" );
}
4.设定节点属性。
TiXmlElement  window = new TiXmlElement( "Demo" );  
window->SetAttribute("name", "Circle");
window->SetAttribute("x", 5);
window->SetAttribute("y", 15);
window->SetDoubleAttribute("radius", 3.14159);
5.获取元素的所有属性,并打印出属性名称和值
int printElement(TiXmlElement* pElement, unsigned int indent)
{
 if ( !pElement ) return 0;

 TiXmlAttribute* pAttrib=pElement->FirstAttribute();
 int i=0;
 int ival;
 double dval;
 const char* pIndent=getIndent(indent);
 printf("\n");
 while (pAttrib)
 {
  printf( "%s%s: value=[%s]", pIndent, pAttrib->Name(), pAttrib->Value());

  if (pAttrib->QueryIntValue(&ival)==TIXML_SUCCESS)    printf( " int=%d", ival);
  if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS) printf( " d=%1.1f", dval);
  printf( "\n" );
  i++;
  pAttrib=pAttrib->Next();
 }
 return i;
}
6.写入文件,其实上面已经用到了。
doc.SaveFile( saveFilename );  
7.建立一个其内容如下的文档:
<?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>

void main( )  
{  
 TiXmlDocument doc;  
 TiXmlElement* msg;
  TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" );  //文档声明
 doc.LinkEndChild( decl );  
 
 TiXmlElement * root = new TiXmlElement( "MyApp" );  
 doc.LinkEndChild( root );  //根元素

 TiXmlComment * comment = new TiXmlComment();//xml注释
 comment->SetValue(" Settings for MyApp " );  
 root->LinkEndChild( comment );  //插入根元素之间 
 TiXmlElement * msgs = new TiXmlElement( "Messages" );  
 root->LinkEndChild( msgs );  //定义元素Messages,插入到root
 
 msg = new TiXmlElement( "Welcome" );  //定义新元素,并插入到msgs 
 msg->LinkEndChild( new TiXmlText( "Welcome to MyApp" ));  
 msgs->LinkEndChild( msg );  
 
 msg = new TiXmlElement( "Farewell" );  //定义新元素,并插入到msgs 
 msg->LinkEndChild( new TiXmlText( "Thank you for using MyApp" ));  
 msgs->LinkEndChild( msg );  
 
 TiXmlElement * windows = new TiXmlElement( "Windows" );  
 root->LinkEndChild( windows );  //root中插入新元素windows

 TiXmlElement * window;
 window = new TiXmlElement( "Window" );  
 windows->LinkEndChild( window );  //定义新元素,并设定其属性。
 window->SetAttribute("name", "MainFrame");
 window->SetAttribute("x", 5);
 window->SetAttribute("y", 15);
 window->SetAttribute("w", 400);
 window->SetAttribute("h", 250);

 TiXmlElement * cxn = new TiXmlElement( "Connection" );  
 root->LinkEndChild( cxn );  
 cxn->SetAttribute("ip", "192.168.0.1");
 cxn->SetDoubleAttribute("timeout", 123.456); // floating point attrib
 
 dump_to_stdout( &doc );
 doc.SaveFile( "appsettings.xml" );  //保存文件

8.对象到XML的转换。
///class
#include <string>
#include <map>
using namespace std;

typedef std::map<std::string,std::string> MessageMap;

// a basic window abstraction - demo purposes only
class WindowSettings
{
public:
 int x,y,w,h;
 string name;

 WindowSettings()
  : x(0), y(0), w(100), h(100), name("Untitled")
 {
 }

 WindowSettings(int x, int y, int w, int h, const string& name)
 {
  this->x=x;
  this->y=y;
  this->w=w;
  this->h=h;
  this->name=name;
 }
};

class ConnectionSettings
{
public:
 string ip;
 double timeout;
};

class AppSettings
{
public:
 string m_name;
 MessageMap m_messages;
 list<WindowSettings> m_windows;
 ConnectionSettings m_connection;

 AppSettings() {}

 void save(const char* pFilename);
 void load(const char* pFilename);
 
 // just to show how to do it
 void setDemoValues()
 {
  m_name="MyApp";
  m_messages.clear();
  m_messages["Welcome"]="Welcome to "+m_name;
  m_messages["Farewell"]="Thank you for using "+m_name;
  m_windows.clear();
  m_windows.push_back(WindowSettings(15,15,400,250,"Main"));
  m_connection.ip="Unknown";
  m_connection.timeout=123.456;
 }
};
///创建文件,并加载
int main(void)
{
 AppSettings settings;
 
 settings.save("appsettings2.xml");
 settings.load("appsettings2.xml");
 return 0;
}
///创建,修改和保存
int main(void)
{
 // block: customise and save settings
 {
  AppSettings settings;
  settings.m_name="HitchHikerApp";
  settings.m_messages["Welcome"]="Don't Panic";
  settings.m_messages["Farewell"]="Thanks for all the fish";
  settings.m_windows.push_back(WindowSettings(15,25,300,250,"BookFrame"));
  settings.m_connection.ip="192.168.0.77";
  settings.m_connection.timeout=42.0;

  settings.save("appsettings2.xml");
 }
 
 // block: load settings
 {
  AppSettings settings;
  settings.load("appsettings2.xml");
  printf("%s: %s\n", settings.m_name.c_str(), 
   settings.m_messages["Welcome"].c_str());
  WindowSettings & w=settings.m_windows.front();
  printf("%s: Show window '%s' at %d,%d (%d x %d)\n", 
   settings.m_name.c_str(), w.name.c_str(), w.x, w.y, w.w, w.h);
  printf("%s: %s\n", settings.m_name.c_str(), settings.m_messages["Farewell"].c_str());
 }
 return 0;
}
输出:
HitchHikerApp: Don't Panic
HitchHikerApp: Show window 'BookFrame' at 15,25 (300 x 100)
HitchHikerApp: Thanks for all the fish

#6



9.XML到对象的转换。
void AppSettings::load(const char* pFilename)
{
 TiXmlDocument doc(pFilename);
 if (!doc.LoadFile()) return;

 TiXmlHandle hDoc(&doc);
 TiXmlElement* pElem;
 TiXmlHandle hRoot(0);

 // block: name
 {
  pElem=hDoc.FirstChildElement().Element();
  // should always have a valid root but handle gracefully if it does
  if (!pElem) return;
  m_name=pElem->Value();

  // save this for later
  hRoot=TiXmlHandle(pElem);
 }

 // block: string table
 {
  m_messages.clear(); // trash existing table

  pElem=hRoot.FirstChild( "Messages" ).FirstChild().Element();
  for( pElem; pElem; pElem=pElem->NextSiblingElement())
  {
   const char *pKey=pElem->Value();
   const char *pText=pElem->GetText();
   if (pKey && pText) 
   {
    m_messages[pKey]=pText;
   }
  }
 }

 // block: windows
 {
  m_windows.clear(); // trash existing list

  TiXmlElement* pWindowNode=hRoot.FirstChild( "Windows" ).FirstChild().Element();
  for( pWindowNode; pWindowNode; pWindowNode=pWindowNode->NextSiblingElement())
  {
   WindowSettings w;
   const char *pName=pWindowNode->Attribute("name");
   if (pName) w.name=pName;
   
   pWindowNode->QueryIntAttribute("x", &w.x); // If this fails, original value is left 

as-is
   pWindowNode->QueryIntAttribute("y", &w.y);
   pWindowNode->QueryIntAttribute("w", &w.w);
   pWindowNode->QueryIntAttribute("hh", &w.h);

   m_windows.push_back(w);
  }
 }

 // block: connection
 {
  pElem=hRoot.FirstChild("Connection").Element();
  if (pElem)
  {
   m_connection.ip=pElem->Attribute("ip");
   pElem->QueryDoubleAttribute("timeout",&m_connection.timeout);
  }
 }
}

10.一个比较完整的例子,加载任意的XML文档,并在控制台上输出。
//
#include "stdafx.h"
#include "tinyxml.h"

// ----------------------------------------------------------------------
// STDOUT dump and indenting utility functions
// ----------------------------------------------------------------------
const unsigned int NUM_INDENTS_PER_SPACE=2;

const char * getIndent( unsigned int numIndents )
{
 static const char * pINDENT="                                      + ";
 static const unsigned int LENGTH=strlen( pINDENT );
 unsigned int n=numIndents*NUM_INDENTS_PER_SPACE;
 if ( n > LENGTH ) n = LENGTH;

 return &pINDENT[ LENGTH-n ];
}

// same as getIndent but no "+" at the end
const char * getIndentAlt( unsigned int numIndents )
{
 static const char * pINDENT="                                        ";
 static const unsigned int LENGTH=strlen( pINDENT );
 unsigned int n=numIndents*NUM_INDENTS_PER_SPACE;
 if ( n > LENGTH ) n = LENGTH;

 return &pINDENT[ LENGTH-n ];
}

int dump_attribs_to_stdout(TiXmlElement* pElement, unsigned int indent)
{
 if ( !pElement ) return 0;

 TiXmlAttribute* pAttrib=pElement->FirstAttribute();
 int i=0;
 int ival;
 double dval;
 const char* pIndent=getIndent(indent);
 printf("\n");
 while (pAttrib)
 {
  printf( "%s%s: value=[%s]", pIndent, pAttrib->Name(), pAttrib->Value());

  if (pAttrib->QueryIntValue(&ival)==TIXML_SUCCESS)    printf( " int=%d", ival);
  if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS) printf( " d=%1.1f", dval);
  printf( "\n" );
  i++;
  pAttrib=pAttrib->Next();
 }
 return i; 
}

void dump_to_stdout( TiXmlNode* pParent, unsigned int indent = 0 )
{
 if ( !pParent ) return;

 TiXmlNode* pChild;
 TiXmlText* pText;
 int t = pParent->Type();
 printf( "%s", getIndent(indent));
 int num;

 switch ( t )
 {
 case TiXmlNode::DOCUMENT:
  printf( "Document" );
  break;

 case TiXmlNode::ELEMENT:
  printf( "Element [%s]", pParent->Value() );
  num=dump_attribs_to_stdout(pParent->ToElement(), indent+1);
  switch(num)
  {
   case 0:  printf( " (No attributes)"); break;
   case 1:  printf( "%s1 attribute", getIndentAlt(indent)); break;
   default: printf( "%s%d attributes", getIndentAlt(indent), num); break;
  }
  break;

 case TiXmlNode::COMMENT:
  printf( "Comment: [%s]", pParent->Value());
  break;

 case TiXmlNode::UNKNOWN:
  printf( "Unknown" );
  break;

 case TiXmlNode::TEXT:
  pText = pParent->ToText();
  printf( "Text: [%s]", pText->Value() );
  break;

 case TiXmlNode::DECLARATION:
  printf( "Declaration" );
  break;
 default:
  break;
 }
 printf( "\n" );
 for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) 
 {
  dump_to_stdout( pChild, indent+1 );
 }
}

// load the named file and dump its structure to STDOUT
void dump_to_stdout(const char* pFilename)
{
 TiXmlDocument doc(pFilename);
 bool loadOkay = doc.LoadFile();
 if (loadOkay)
 {
  printf("\n%s:\n", pFilename);
  dump_to_stdout( &doc ); // defined later in the tutorial
 }
 else
 {
  printf("Failed to load file \"%s\"\n", pFilename);
 }
}

// ----------------------------------------------------------------------
// main() for printing files named on the command line
// ----------------------------------------------------------------------
int main(int argc, char* argv[])
{
 for (int i=1; i<argc; i++)
 {
  dump_to_stdout(argv[i]);
 }
 return 0;
}

#7


http://prdownloads.sourceforge.net/tinyxml/tinyxml_2_4_3.zip?download
下载的工程里面有一个,有个docs文档,可以看一下,里面有类的结构和方法,挺详细的,不过是英文的。

#8


网上例子很多,不知道原创作者是谁,也不知道有没人试过,反正我是试不通

只有tinyXML自带的例子能用

#9


tinyxml怎么追加数据啊?
我用tinyxml加载了一个xml文件
试图向root结点追加link一个结点,可是没有加成功,但是也没有任何错误

#10


mark一下

#11


up again

#12


貌似包含头文件是不行的。总是出错误。

#13


好多人自己没试过就贴别人的代码,有意思吗?

#14


该回复于2012-05-25 15:58:11被版主删除

#1


,tinyxml很好用的,下载下来的例子就可以

#2


http://www.360doc.com/showWeb/0/31/495795.aspx

#3


[转]
在这里我们并不是要讲解如何使用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文件的过程。这段代码将产生一个文件,文件内容如下:



它产生的结构可以用一棵树来表示,见下图:


 

 

 

 

 

 

 

 

 

 

 

 

 

接下来,我们看一下如何从上面这个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文件打开后,先得到它的第一个子结点,如果子结点存在,得到这个结点的属性。然后又打开这个结点的第一个子结点,读出其中的数据。最后关闭文件句柄。

#4


1、下载tinyxml
tinyxml,自己在里面找找
解压后包括两部分,tinyxml和一个静态链接库文件xmladapter.lib
2、使用tinyxml通常需要把它包含到自己的工程文件中去,可是你也可以选择以下的方式:
a、project->settings->选项卡link->category选择input->objects/library modules下添加xmladapter.lib;在addtional library path 下添加xmladapter路径
b、工程中包含以下头文件
#include "TinyXml/tinystr.h"
#include "TinyXml/tinyxml.h"
3、这用就可以开始使用tinyxml开始操作xml文件了,具体的操作方式:
    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的一些操作。
     那我们如何使用这些类以及他们的方法来操纵我们的XML呢?请看下面。
    一、读取XML(假设我们的Xml文档中的内容与上面的Xml内容一样)
    //创建一个XML的文档对象。
     TiXmlDocument *myDocument = new TiXmlDocument("填上你的Xml文件名");
    myDocument->LoadFile();
    //获得根元素,即Persons。
     TiXmlElement *RootElement = myDocument.RootElement();
    //输出根元素名称,即输出Persons。
     cout << RootElement->Value() << endl;
    //获得第一个Person节点。
     TiXmlElement *FirstPerson = RootElement->FirstChildElement();
    //获得第一个Person的name节点和age节点和ID属性。
     TiXmlElement *NameElement = FirstPerson->FirstChildElement();
     TiXmlElement *AgeElement = NameElement->NextSiblingElement();
     TiXmlAttribute *IDAttribute = FirstPerson->FirstAttribute();
    //输出第一个Person的name内容,即周星星;age内容,即20;ID属性,即1。
     cout << NameElement->FirstChild()->Value << endl;
     cout << AgeElement->FirstChild()->Value << endl;
     cout << IDAttribute->Value() << endl;
    
     看,读取XML是不是很简单阿,和Java的XML解析库非常的相似,就是名字改了一下而已。
    二、生成XML内容
    //创建一个XML的文档对象。
     TiXmlDocument *myDocument = new TiXmlDocument();
    //创建一个根元素并连接。
     TiXmlElement *RootElement = new TiXmlElement("Persons");
     myDocument->LinkEndChild(RootElement);
    //创建一个Person元素并连接。
     TiXmlElement *PersonElement = new TiXmlElement("Person");
     RootElement->LinkEndChild(PersonElement);
    //设置Person元素的属性。
     PersonElement->SetAttribute("ID", "1");
    //创建name元素、age元素并连接。
     TiXmlElement *NameElement = new TiXmlElement("name");
     TiXmlElement *AgeElement = new TiXmlElement("age");
     PersonElement->LinkEndChild(NameElement);
     PersonElement->LinkEndChild(AgeElement);
    //设置name元素和age元素的内容并连接。
     TiXmlText *NameContent = new TiXmlText("周星星");
     TiXmlText *AgeContent = new TiXmlText("20");
     NameElement->LinkEndChild(NameContent);
     AgeElement->LinkEndChild(AgeContent);
    //保存到文件
     myDocument->SaveFile("要保存的xml文件名");
     这样,便创建了一个如下的xml文件:
    <Persons>
         <Person ID="1">
             <name>周星星</name>
             <age>20</age>
         </Person>
     </Persons>

#5


第二个例子:
1.加载文件。
TiXmlDocument doc( "demo.xml" );
doc.LoadFile();
2.
void main(void)
{
 TiXmlDocument doc("example1.xml");
 bool loadOkay = doc.LoadFile();
 if (loadOkay)
 {
  printf("\n%s:\n", pFilename);
  dump_to_stdout( &doc ); // defined later in the tutorial
 }
 else
 {
  printf("Failed to load file \"%s\"\n", pFilename);
 }
 return;
}
example1.xml 的内容如果是:
<?xml version="1.0" ?>
<Hello>World</Hello>
输出为:
DOCUMENT
+ DECLARATION
+ ELEMENT Hello
  + TEXT[World]
3.建立文档的方法.
void build( )
{               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( "example1.xml" );
}
4.设定节点属性。
TiXmlElement  window = new TiXmlElement( "Demo" );  
window->SetAttribute("name", "Circle");
window->SetAttribute("x", 5);
window->SetAttribute("y", 15);
window->SetDoubleAttribute("radius", 3.14159);
5.获取元素的所有属性,并打印出属性名称和值
int printElement(TiXmlElement* pElement, unsigned int indent)
{
 if ( !pElement ) return 0;

 TiXmlAttribute* pAttrib=pElement->FirstAttribute();
 int i=0;
 int ival;
 double dval;
 const char* pIndent=getIndent(indent);
 printf("\n");
 while (pAttrib)
 {
  printf( "%s%s: value=[%s]", pIndent, pAttrib->Name(), pAttrib->Value());

  if (pAttrib->QueryIntValue(&ival)==TIXML_SUCCESS)    printf( " int=%d", ival);
  if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS) printf( " d=%1.1f", dval);
  printf( "\n" );
  i++;
  pAttrib=pAttrib->Next();
 }
 return i;
}
6.写入文件,其实上面已经用到了。
doc.SaveFile( saveFilename );  
7.建立一个其内容如下的文档:
<?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>

void main( )  
{  
 TiXmlDocument doc;  
 TiXmlElement* msg;
  TiXmlDeclaration* decl = new TiXmlDeclaration( "1.0", "", "" );  //文档声明
 doc.LinkEndChild( decl );  
 
 TiXmlElement * root = new TiXmlElement( "MyApp" );  
 doc.LinkEndChild( root );  //根元素

 TiXmlComment * comment = new TiXmlComment();//xml注释
 comment->SetValue(" Settings for MyApp " );  
 root->LinkEndChild( comment );  //插入根元素之间 
 TiXmlElement * msgs = new TiXmlElement( "Messages" );  
 root->LinkEndChild( msgs );  //定义元素Messages,插入到root
 
 msg = new TiXmlElement( "Welcome" );  //定义新元素,并插入到msgs 
 msg->LinkEndChild( new TiXmlText( "Welcome to MyApp" ));  
 msgs->LinkEndChild( msg );  
 
 msg = new TiXmlElement( "Farewell" );  //定义新元素,并插入到msgs 
 msg->LinkEndChild( new TiXmlText( "Thank you for using MyApp" ));  
 msgs->LinkEndChild( msg );  
 
 TiXmlElement * windows = new TiXmlElement( "Windows" );  
 root->LinkEndChild( windows );  //root中插入新元素windows

 TiXmlElement * window;
 window = new TiXmlElement( "Window" );  
 windows->LinkEndChild( window );  //定义新元素,并设定其属性。
 window->SetAttribute("name", "MainFrame");
 window->SetAttribute("x", 5);
 window->SetAttribute("y", 15);
 window->SetAttribute("w", 400);
 window->SetAttribute("h", 250);

 TiXmlElement * cxn = new TiXmlElement( "Connection" );  
 root->LinkEndChild( cxn );  
 cxn->SetAttribute("ip", "192.168.0.1");
 cxn->SetDoubleAttribute("timeout", 123.456); // floating point attrib
 
 dump_to_stdout( &doc );
 doc.SaveFile( "appsettings.xml" );  //保存文件

8.对象到XML的转换。
///class
#include <string>
#include <map>
using namespace std;

typedef std::map<std::string,std::string> MessageMap;

// a basic window abstraction - demo purposes only
class WindowSettings
{
public:
 int x,y,w,h;
 string name;

 WindowSettings()
  : x(0), y(0), w(100), h(100), name("Untitled")
 {
 }

 WindowSettings(int x, int y, int w, int h, const string& name)
 {
  this->x=x;
  this->y=y;
  this->w=w;
  this->h=h;
  this->name=name;
 }
};

class ConnectionSettings
{
public:
 string ip;
 double timeout;
};

class AppSettings
{
public:
 string m_name;
 MessageMap m_messages;
 list<WindowSettings> m_windows;
 ConnectionSettings m_connection;

 AppSettings() {}

 void save(const char* pFilename);
 void load(const char* pFilename);
 
 // just to show how to do it
 void setDemoValues()
 {
  m_name="MyApp";
  m_messages.clear();
  m_messages["Welcome"]="Welcome to "+m_name;
  m_messages["Farewell"]="Thank you for using "+m_name;
  m_windows.clear();
  m_windows.push_back(WindowSettings(15,15,400,250,"Main"));
  m_connection.ip="Unknown";
  m_connection.timeout=123.456;
 }
};
///创建文件,并加载
int main(void)
{
 AppSettings settings;
 
 settings.save("appsettings2.xml");
 settings.load("appsettings2.xml");
 return 0;
}
///创建,修改和保存
int main(void)
{
 // block: customise and save settings
 {
  AppSettings settings;
  settings.m_name="HitchHikerApp";
  settings.m_messages["Welcome"]="Don't Panic";
  settings.m_messages["Farewell"]="Thanks for all the fish";
  settings.m_windows.push_back(WindowSettings(15,25,300,250,"BookFrame"));
  settings.m_connection.ip="192.168.0.77";
  settings.m_connection.timeout=42.0;

  settings.save("appsettings2.xml");
 }
 
 // block: load settings
 {
  AppSettings settings;
  settings.load("appsettings2.xml");
  printf("%s: %s\n", settings.m_name.c_str(), 
   settings.m_messages["Welcome"].c_str());
  WindowSettings & w=settings.m_windows.front();
  printf("%s: Show window '%s' at %d,%d (%d x %d)\n", 
   settings.m_name.c_str(), w.name.c_str(), w.x, w.y, w.w, w.h);
  printf("%s: %s\n", settings.m_name.c_str(), settings.m_messages["Farewell"].c_str());
 }
 return 0;
}
输出:
HitchHikerApp: Don't Panic
HitchHikerApp: Show window 'BookFrame' at 15,25 (300 x 100)
HitchHikerApp: Thanks for all the fish

#6



9.XML到对象的转换。
void AppSettings::load(const char* pFilename)
{
 TiXmlDocument doc(pFilename);
 if (!doc.LoadFile()) return;

 TiXmlHandle hDoc(&doc);
 TiXmlElement* pElem;
 TiXmlHandle hRoot(0);

 // block: name
 {
  pElem=hDoc.FirstChildElement().Element();
  // should always have a valid root but handle gracefully if it does
  if (!pElem) return;
  m_name=pElem->Value();

  // save this for later
  hRoot=TiXmlHandle(pElem);
 }

 // block: string table
 {
  m_messages.clear(); // trash existing table

  pElem=hRoot.FirstChild( "Messages" ).FirstChild().Element();
  for( pElem; pElem; pElem=pElem->NextSiblingElement())
  {
   const char *pKey=pElem->Value();
   const char *pText=pElem->GetText();
   if (pKey && pText) 
   {
    m_messages[pKey]=pText;
   }
  }
 }

 // block: windows
 {
  m_windows.clear(); // trash existing list

  TiXmlElement* pWindowNode=hRoot.FirstChild( "Windows" ).FirstChild().Element();
  for( pWindowNode; pWindowNode; pWindowNode=pWindowNode->NextSiblingElement())
  {
   WindowSettings w;
   const char *pName=pWindowNode->Attribute("name");
   if (pName) w.name=pName;
   
   pWindowNode->QueryIntAttribute("x", &w.x); // If this fails, original value is left 

as-is
   pWindowNode->QueryIntAttribute("y", &w.y);
   pWindowNode->QueryIntAttribute("w", &w.w);
   pWindowNode->QueryIntAttribute("hh", &w.h);

   m_windows.push_back(w);
  }
 }

 // block: connection
 {
  pElem=hRoot.FirstChild("Connection").Element();
  if (pElem)
  {
   m_connection.ip=pElem->Attribute("ip");
   pElem->QueryDoubleAttribute("timeout",&m_connection.timeout);
  }
 }
}

10.一个比较完整的例子,加载任意的XML文档,并在控制台上输出。
//
#include "stdafx.h"
#include "tinyxml.h"

// ----------------------------------------------------------------------
// STDOUT dump and indenting utility functions
// ----------------------------------------------------------------------
const unsigned int NUM_INDENTS_PER_SPACE=2;

const char * getIndent( unsigned int numIndents )
{
 static const char * pINDENT="                                      + ";
 static const unsigned int LENGTH=strlen( pINDENT );
 unsigned int n=numIndents*NUM_INDENTS_PER_SPACE;
 if ( n > LENGTH ) n = LENGTH;

 return &pINDENT[ LENGTH-n ];
}

// same as getIndent but no "+" at the end
const char * getIndentAlt( unsigned int numIndents )
{
 static const char * pINDENT="                                        ";
 static const unsigned int LENGTH=strlen( pINDENT );
 unsigned int n=numIndents*NUM_INDENTS_PER_SPACE;
 if ( n > LENGTH ) n = LENGTH;

 return &pINDENT[ LENGTH-n ];
}

int dump_attribs_to_stdout(TiXmlElement* pElement, unsigned int indent)
{
 if ( !pElement ) return 0;

 TiXmlAttribute* pAttrib=pElement->FirstAttribute();
 int i=0;
 int ival;
 double dval;
 const char* pIndent=getIndent(indent);
 printf("\n");
 while (pAttrib)
 {
  printf( "%s%s: value=[%s]", pIndent, pAttrib->Name(), pAttrib->Value());

  if (pAttrib->QueryIntValue(&ival)==TIXML_SUCCESS)    printf( " int=%d", ival);
  if (pAttrib->QueryDoubleValue(&dval)==TIXML_SUCCESS) printf( " d=%1.1f", dval);
  printf( "\n" );
  i++;
  pAttrib=pAttrib->Next();
 }
 return i; 
}

void dump_to_stdout( TiXmlNode* pParent, unsigned int indent = 0 )
{
 if ( !pParent ) return;

 TiXmlNode* pChild;
 TiXmlText* pText;
 int t = pParent->Type();
 printf( "%s", getIndent(indent));
 int num;

 switch ( t )
 {
 case TiXmlNode::DOCUMENT:
  printf( "Document" );
  break;

 case TiXmlNode::ELEMENT:
  printf( "Element [%s]", pParent->Value() );
  num=dump_attribs_to_stdout(pParent->ToElement(), indent+1);
  switch(num)
  {
   case 0:  printf( " (No attributes)"); break;
   case 1:  printf( "%s1 attribute", getIndentAlt(indent)); break;
   default: printf( "%s%d attributes", getIndentAlt(indent), num); break;
  }
  break;

 case TiXmlNode::COMMENT:
  printf( "Comment: [%s]", pParent->Value());
  break;

 case TiXmlNode::UNKNOWN:
  printf( "Unknown" );
  break;

 case TiXmlNode::TEXT:
  pText = pParent->ToText();
  printf( "Text: [%s]", pText->Value() );
  break;

 case TiXmlNode::DECLARATION:
  printf( "Declaration" );
  break;
 default:
  break;
 }
 printf( "\n" );
 for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) 
 {
  dump_to_stdout( pChild, indent+1 );
 }
}

// load the named file and dump its structure to STDOUT
void dump_to_stdout(const char* pFilename)
{
 TiXmlDocument doc(pFilename);
 bool loadOkay = doc.LoadFile();
 if (loadOkay)
 {
  printf("\n%s:\n", pFilename);
  dump_to_stdout( &doc ); // defined later in the tutorial
 }
 else
 {
  printf("Failed to load file \"%s\"\n", pFilename);
 }
}

// ----------------------------------------------------------------------
// main() for printing files named on the command line
// ----------------------------------------------------------------------
int main(int argc, char* argv[])
{
 for (int i=1; i<argc; i++)
 {
  dump_to_stdout(argv[i]);
 }
 return 0;
}

#7


http://prdownloads.sourceforge.net/tinyxml/tinyxml_2_4_3.zip?download
下载的工程里面有一个,有个docs文档,可以看一下,里面有类的结构和方法,挺详细的,不过是英文的。

#8


网上例子很多,不知道原创作者是谁,也不知道有没人试过,反正我是试不通

只有tinyXML自带的例子能用

#9


tinyxml怎么追加数据啊?
我用tinyxml加载了一个xml文件
试图向root结点追加link一个结点,可是没有加成功,但是也没有任何错误

#10


mark一下

#11


up again

#12


貌似包含头文件是不行的。总是出错误。

#13


好多人自己没试过就贴别人的代码,有意思吗?

#14


该回复于2012-05-25 15:58:11被版主删除