TinyXML学习记录及整理
整理自
http://www.cnblogs.com/phinecos/archive/2008/03/11/1100912.html
http://www.cppblog.com/age100/archive/2010/05/12/115203.html
http://panpan.blog.51cto.com/489034/104961
及百度文庫。
?
TinyXML是一個開源的解析XML的解析庫,能夠用于C++,能夠在Windows或Linux中編譯。這個解析庫的模型通過解析XML文件,然后在內(nèi)存中生成DOM模型,從而讓我們很方便的遍歷這棵XML樹。
DOM模型即文檔對象模型,是將整個文檔分成多個元素(如書、章、節(jié)、段等),并利用樹型結(jié)構(gòu)表示這些元素之間的順序關(guān)系以及嵌套包含關(guān)系。
首先從網(wǎng)上下載TinyXML的庫,文件夾的名字是TinyXpath,在工程里做如下配置:
?在附加包含路徑里添加:你的tinyxpath路徑/tinyxpath/include
?在附加庫路徑里添加:你的tinyxpath路徑/tinyxpath/lib
?在對象/庫路徑里添加:tinyxpathd.lib,如果使用release版本,則是tinyxpath.lib。
?另外,由于我開發(fā)的項目是多線程的,所以設(shè)置了多線程的環(huán)境,因此使用TinyXML沒有出現(xiàn)問題。本人將TinyXML寫在一個單獨的C++工程進行測試,發(fā)現(xiàn)如果不設(shè)置多線程的環(huán)境,會出現(xiàn)鏈接錯誤。我覺得原因可能是TinyXML使用了多線程環(huán)境,因此需要設(shè)置多線程的環(huán)境。在工程/設(shè)置下的C/C++選項卡中,選擇Code?Generation,在Use?run-time?library中選擇Debug?MultiThreaed?DLL即可。?
?
元素函數(shù)總結(jié)
ValueStr?????//返回元素名稱
SetValue?????//設(shè)置元素名稱
Parent?????//返回父節(jié)點對象
FirstChild????//返回第一個子節(jié)點
LastChild?????//返回最后一個子節(jié)點
IterateChildren???//返回下一個子節(jié)點
InsertEndChild???//在最后一個子節(jié)點后插入子節(jié)點
InsertBeforeChild???//在指定的子節(jié)點前插入子節(jié)點
InsertAfterChild???//在指定的子節(jié)點后插入子節(jié)點
ReplaceChild????//替換指定的子節(jié)點
RemoveChild????//刪除指定的子節(jié)點
Clear?????//刪除所有的子節(jié)點
PreviousSibling???//返回同級中前一個節(jié)點
NextSibling????//返回同級中后一個節(jié)點
NextSiblingElement???//返回同級中后一個元素
FirstChildElement???//返回第一個子元素節(jié)點
Attribute?????//返回元素中的屬性值
QueryValueAttribute?//返回元素中的屬性值
SetAttribute????//設(shè)置元素中的屬性值
FirstAttribute???//返回元素中第一個屬性對象
LastAttribute????//返回元素中最后一個屬性對象
RemoveAttribute???//刪除元素中指定的屬性對象?
?
如下是一個XML片段:
????<Persons>
????????<Person?ID="1">
????????????<name>周星星</name>
????????????<age>20</age>
????????</Person>
????????<Person?ID="2">
????????????<name>白晶晶</name>
????????????<age>18</age>
????????</Person>
????</Persons>
????在TinyXML中,根據(jù)XML的各種元素來定義了一些類:
TiXmlBase:整個TinyXML模型的基類。
TiXmlAttribute:對應(yīng)于XML中的元素的屬性。比如<Person?ID="1">
TiXmlNode:對應(yīng)于DOM結(jié)構(gòu)中的節(jié)點。
TiXmlComment:對應(yīng)于XML中的注釋。
TiXmlDeclaration:對應(yīng)于XML中的申明部分, ?即<?versiong="1.0"??>。
TiXmlDocument:對應(yīng)于XML的整個文檔。 ??如new?TiXmlDocument("xxx.xm");
TiXmlElement:對應(yīng)于XML的元素。 比如<Person?ID="1">
TiXmlText:對應(yīng)于XML的文字部分。? ?比如<age>18</age>
TiXmlUnknown:對應(yīng)于XML的未知部分。?
TiXmlHandler:定義了針對XML的一些操作。?
?
?
????一、讀取XML(假設(shè)我們的Xml文檔中的內(nèi)容與上面的Xml內(nèi)容一樣)
????//創(chuàng)建一個XML的文檔對象。
????TiXmlDocument?*myDocument?=?new?TiXmlDocument("Resources.xm");
????myDocument->LoadFile();
????//獲得根元素,即Persons。
????TiXmlElement?*RootElement?=?myDocument.RootElement();
????//輸出根元素名稱,即輸出Persons。
????cout?<<?RootElement->Value()?<<?endl;
????//獲得第一個Person節(jié)點。
????TiXmlElement?*FirstPerson?=?RootElement->FirstChildElement();
????//獲得第一個Person的name節(jié)點和age節(jié)點和ID屬性。
????TiXmlElement?*NameElement?=?FirstPerson->FirstChildElement();
????TiXmlElement?*AgeElement?=?NameElement->NextSiblingElement();
????TiXmlAttribute?*IDAttribute?=?FirstPerson->FirstAttribute();
????//輸出第一個Person的name內(nèi)容,即周星星;age內(nèi)容,即20;ID屬性,即1。
????cout?<<?NameElement->FirstChild()->Value?<<?endl;
????cout?<<?AgeElement->FirstChild()->Value?<<?endl;
????cout?<<?IDAttribute->Value()?<<?endl;
????二、生成XML內(nèi)容
????//創(chuàng)建一個XML的文檔對象。
????TiXmlDocument?*myDocument?=?new?TiXmlDocument();
????//創(chuàng)建一個根元素并連接。
????TiXmlElement?*RootElement?=?new?TiXmlElement("Persons");
????myDocument->LinkEndChild(RootElement);
????//創(chuàng)建一個Person元素并連接。
????TiXmlElement?*PersonElement?=?new?TiXmlElement("Person");
????RootElement->LinkEndChild(PersonElement);
????//設(shè)置Person元素的屬性。
????PersonElement->SetAttribute("ID",?"1");
????//創(chuàng)建name元素、age元素并連接。
????TiXmlElement?*NameElement?=?new?TiXmlElement("name");
????TiXmlElement?*AgeElement?=?new?TiXmlElement("age");
????PersonElement->LinkEndChild(NameElement);
????PersonElement->LinkEndChild(AgeElement);
????//設(shè)置name元素和age元素的內(nèi)容并連接。
????TiXmlText?*NameContent?=?new?TiXmlText("周星星");
????TiXmlText?*AgeContent?=?new?TiXmlText("20");
????NameElement->LinkEndChild(NameContent);
????AgeElement->LinkEndChild(AgeContent);
????//保存到文件
????myDocument->SaveFile("要保存的xml文件名");//保存到文件!!!!!!!!!!!
????這樣,便創(chuàng)建了一個如下的xml文件:
????<Persons>
????????<Person?ID="1">
????????????<name>周星星</name>
????????????<age>20</age>
????????</Person>
????</Persons>?
?
?
?
?
<Class?name="計算機軟件班">
????<Students>
????????<student?name="張三"?studentNo="13031001"?sex="男"?age="22">
????????????<phone>88208888</phone>
????????????<address>西安市太白南路二號</address>
????????</student>
????????<student?name="李四"?studentNo="13031002"?sex="男"?age="20">
????????????<phone>88206666</phone>
????????????<address>西安市光華路</address>
????????</student>
????</Students>
</Class>
?
????程序代碼XmlParseExample.cpp如下所示:
#include?<iostream>
#include?<string>
#include?<tinyxml.h>
??using?std::string;
??int?main()
{
??TiXmlDocument*?myDocument?=?new?TiXmlDocument();
??myDocument->LoadFile("Students.xml");
??TiXmlElement*?rootElement?=?myDocument->RootElement();??//Class
??TiXmlElement*?studentsElement?=?rootElement->FirstChildElement();??//Students
??TiXmlElement*?studentElement?=?studentsElement->FirstChildElement();??//Students
??while?(?studentElement?)?{
????TiXmlAttribute*?attributeOfStudent?=?studentElement->FirstAttribute();??//獲得student的name屬性
????while?(?attributeOfStudent?)?{
??????std::cout?<<?attributeOfStudent->Name()?<<?"?:?"?<<?attributeOfStudent->Value()?<<?std::endl;
??????attributeOfStudent?=?attributeOfStudent->Next();
????}
????TiXmlElement*?phoneElement?=?studentElement->FirstChildElement();//獲得student的phone元素
????std::cout?<<?"phone"?<<?"?:?"?<<?phoneElement->GetText()?<<?std::endl;
????TiXmlElement*?addressElement?=?phoneElement->NextSiblingElement();
????std::cout?<<?"address"?<<?"?:?"?<<?phoneElement->GetText()?<<?std::endl;
????studentElement?=?studentElement->NextSiblingElement();
??}
??return?0;
}
????程序運行結(jié)果如下:
name?:?張三
studentNo?:?13031001
sex?:?男
age?:?22
phone?:?88208888
address?:?88208888
name?:?李四
studentNo?:?13031002
sex?:?男
age?:?20
phone?:?88206666
address?:?88206666?
?
?
?
讀者對象:對TinyXml有一定了解的人。本文是對TinyXml工具的一些知識點的理解。
需要討論的請聯(lián)系:QQ?:471202412?
1??TinyXml中對TiXmlNode進行了分類,是用一個枚舉進行描述的。
enum?NodeType
{
DOCUMENT,????文檔節(jié)點
ELEMENT,?????元素節(jié)點
COMMENT,?????注釋
UNKNOWN,?????未知節(jié)點
TEXT,????????文本節(jié)點
DECLARATION,?聲明節(jié)點
TYPECOUNT????還沒弄清楚
};
TiXmlNode?*?pNode->Type()?函數(shù)可以返回節(jié)點的類型。
枚舉的比較方法:TiXmlText::TEXT?==?pNode->Type();
?
這幾個類型非常重要,尤其是在遍歷xml時或者查找一個節(jié)點時
我對節(jié)點和元素的理解如下:為了說明問題,我使用下面的xml文檔來舉例說明
<?xml?version="1.0"?encoding="gb2312"?>
<Persons>
<person?Id="200"?Shengao=34?ClassName="計本0508">
<name>vertor</name>
<age>20</age>
<address?encode="utf-8">
<country>中國</country>
<province>山西</province>
<village>王大莊</village>
</address>
</person>
</Persons>
?
2.1?節(jié)點:一種對文檔結(jié)構(gòu)的描述對象
2.2?元素:對文檔某一個數(shù)據(jù)塊的描述
2.3?文本是指沒有孩子的節(jié)點
???例如<village>大王莊</village>??文本節(jié)點是:"大王莊"?
???然而判斷一個節(jié)點是否是文本節(jié)點時并不是根據(jù)pNode->NoChildren()來判斷,而是根據(jù)節(jié)點的類型來判斷
???因為如果一個節(jié)點形如:<village></village>它也是沒有孩子節(jié)點的。
2.4?節(jié)點類可以轉(zhuǎn)換成元素對象。
????例如?TiXmlElement?*?pElement?=?pNode->ToElement();
????那什么時候需要轉(zhuǎn)換成元素呢?
??????當你需要元素的一些屬性值是就需要轉(zhuǎn)換了。
2.5?元素跟節(jié)點都有關(guān)于訪問孩子的函數(shù),
元素訪問孩子的函數(shù):
??FirstChildElement()?返回當前元素的孩子元素
??NextSiblingElement()?返回當前元素的同級元素
節(jié)點訪問節(jié)點孩子的函數(shù):
??FirstChild() 返回當前節(jié)點的孩子節(jié)點
??NextSibing() 返回當前節(jié)點的同級下一個節(jié)點
個人覺得?元素訪問和節(jié)點訪問在一般的訪問下沒有區(qū)別,兩者都可以訪問的孩子
對于一些特殊的情況下才需要區(qū)分。比如你要訪問屬性時,就需要用元素來找到第一個屬性值。
2.6?對于遍歷一個xml文檔時,思路一般是這樣的:
??1?載入一個xml
??2?獲得根元素(不是根節(jié)點)
??3?循環(huán)訪問每一個根元素的子元素
??4?對每一個子元素進行解析。
4.1?獲取子元素的類型Type
4.2?switch(Type)
????case?TEXT:
輸出文本節(jié)點的值pNode->value()
????case?ELEMENT:
????????獲取元素的value(這里的value指的是元素的名字,例如:person元素)
循環(huán)獲取元素的每一個屬性
????a?得到元素的第一個屬性
????b?do——while循環(huán)獲取每一個屬性和值。
????case?COMMENT:?暫時不用管
????case?UNKNOWN:?暫時不用管
????case?DECLARATION:?
?????????獲取元素的版本,編碼方式等等
4.3?循環(huán)遍歷子元素的下一級元素(即孫子元素)?在這里也可以遍歷孫子節(jié)點。
????遞歸調(diào)用第四步。
基本思路就是這樣,具體代碼見后面
2.7?如果定位一個節(jié)點
??唯一確定一個節(jié)點的方法是根據(jù)節(jié)點名,屬性名,屬性值
??1?根據(jù)xml的遍歷思想找到與給定節(jié)點名一樣的節(jié)點
??2?如果這個節(jié)點有屬性并且屬性名和值與給定的一致,說明找到了。
??3?如果沒有一致的,說明解析失敗。
??4?如果沒有給定屬性名和值,則可以默認只查找與節(jié)點名一致的節(jié)點。
2.8?編碼問題
??用TinyXml加載一個xml文檔時,根據(jù)文檔的編碼方式來加載,在操作過程中需要進行編碼轉(zhuǎn)換
??如果encoding=utf-8?則在遍歷時,需要進行編碼轉(zhuǎn)換,具體轉(zhuǎn)換還沒找到方法。
?
2.9?指針的?new和釋放。
???TinyXml已經(jīng)幫我們把指針分配的內(nèi)存進行了管理,在析構(gòu)函數(shù)中進行了處理,我們不需要處理new出來的指針
???如果我們顯示的delete時,有可能影響程序運行。
3.0?對于添加一個節(jié)點,刪除一個節(jié)點,更新一個節(jié)點時,都需要在最后SaveFile,我就好幾次忘了SaveFile,所以調(diào)了老半天。
3.1?總的來說,Tinyxml還是不錯的,以后繼續(xù)學(xué)習(xí)。
部分功能代碼
3.2?對于插入一個節(jié)點,首先獲取要插入節(jié)點的父節(jié)點,然后進行插入,最需要注意的是在查詢父節(jié)點的是時候,必須對應(yīng)同一個文本對象來操作。有可能在兩個函數(shù)中同時打開了同一個xml文檔,雖然名字一樣,但是不是同一個xmldocument對象,所以操作會失敗。
最后要保存。
/************************************************************************/
/*??創(chuàng)建一個xml文檔????????????????????????????????????????????????????????????????????*/
/************************************************************************/
void?createXml()
{
?
//創(chuàng)建一個XML的文檔對象。
????TiXmlDocument?*myDocument?=?new?TiXmlDocument();
TiXmlDeclaration*?decl?=?new?TiXmlDeclaration("1.0","gb2312","yes");
myDocument->LinkEndChild(decl);
????//創(chuàng)建一個根元素并連接。
????TiXmlElement?*RootElement?=?new?TiXmlElement("Persons");
????myDocument->LinkEndChild(RootElement);
????
for(int?i=0;?i<10;i++)
{
//創(chuàng)建一個Person元素并連接。
TiXmlElement?*PersonElement?=?new?TiXmlElement("Person");
RootElement->LinkEndChild(PersonElement);
????
//設(shè)置Person元素的屬性。
PersonElement->SetAttribute("ID",?i);
//創(chuàng)建name元素、age元素并連接。
TiXmlElement?*NameElement?=?new?TiXmlElement("name");
TiXmlElement?*AgeElement?=?new?TiXmlElement("age");
PersonElement->LinkEndChild(NameElement);
PersonElement->LinkEndChild(AgeElement);
????
//設(shè)置name元素和age元素的內(nèi)容并連接。
TiXmlText?*NameContent?=?new?TiXmlText("周星星");
TiXmlText?*AgeContent?=?new?TiXmlText("20");
NameElement->LinkEndChild(NameContent);
AgeElement->LinkEndChild(AgeContent);
}
????//保存到文件
?????myDocument->SaveFile("test.xml");
}
?
/************************************************************************/
/*??遍歷一個xml文檔???????????????????????????????????????????????????????????????????*/
/************************************************************************/
void?readXml()
{
//創(chuàng)建一個XML的文檔對象。
TiXmlDocument?*myDocument?=?new?TiXmlDocument("Person.xml");
myDocument->LoadFile();
?
//獲得xml的頭,即聲明部分
TiXmlDeclaration*?decl?=?myDocument->FirstChild()->ToDeclaration();
cout?<<?"xml文件的版本是:"?<<?decl->Version()?<<?endl;
cout?<<?"xml的編碼格式是:"?<<?decl->Encoding()?<<?endl;
?
//獲得根元素
TiXmlElement?*RootElement?=?myDocument->RootElement();
?
//輸出根元素名稱
cout?<<?RootElement->Value()?<<?endl;
?
TiXmlNode*?pNode??=?NULL;
string?msg?=?"";
for(pNode=RootElement->FirstChildElement();pNode;pNode=pNode->NextSiblingElement())
{
msg?+=?dumpNode(pNode,0);
}
cout?<<?msg?<<?endl;
?
}
?
************************************************************************/
/*描述:遍歷一個元素
??時間:2011-5-1
??參數(shù)說明:pNode節(jié)點,flag?節(jié)點嵌套層數(shù)
/************************************************************************/
string?dumpNode(TiXmlNode?*?pNode,int?flag)
{
string?msg?=?"";
?
if(pNode?==?NULL)
{
return?"";
}
TiXmlText?*?pText?=?NULL;
TiXmlNode?*?pChildNode?=?NULL;
int?t?=?pNode->Type();
if(t?==?TiXmlText::TEXT)??//節(jié)點類型是text節(jié)點
{
pText?=?pNode->ToText();
string?text?=?pText->Value();
if(!text.empty())
{
msg?=?msg?+?"="+?text;
}
?
?
}
else?if(t?==?TiXmlText::ELEMENT)?//節(jié)點類型是Element
{
msg?=?msg?+?"\r\n";
int?num?=?flag;
while(num?>=?1)
{
msg?=?msg?+?"\t";
num--;
}
?
msg?=?msg?+?pNode->Value();
?
//輸出屬性
TiXmlElement?*?pElement?=?pNode->ToElement();
?
TiXmlAttribute?*?pAttr?=?pElement->FirstAttribute();
TiXmlAttribute?*?pNextAttr?=NULL;
string?tmpAttrMsg?=?"[";
if(pAttr?!=?NULL)
{
string?tmpAttrVal?=?"";
string?tmpAttrName?=?"";
?
do
{
tmpAttrVal?=?pAttr->Value();
tmpAttrName?=?pAttr->Name();
tmpAttrMsg?+=?tmpAttrName+"="?+?tmpAttrVal+","; //各個屬性之間用逗號分隔
}while(pAttr?=?pAttr->Next());
tmpAttrMsg?=?tmpAttrMsg.erase(tmpAttrMsg.find_last_of(","));
}
tmpAttrMsg?+=?"]";
msg?+=?tmpAttrMsg;
?
}
//循環(huán)訪問它的每一個元素
for(pChildNode=pNode->FirstChild();pChildNode!=0;pChildNode?=?pChildNode->NextSibling())
{
?
msg?=?msg?+?dumpNode(pChildNode,flag+1);
?
}
return?msg;
?
?
}
/************************************************************************/
/*?查詢出唯一節(jié)點?????????????????????????????????????????????????????????*/
/*?參數(shù)說明:
???string?nodeName????節(jié)點名
???string?nodeAttrName?節(jié)點的屬性
???string?nodeAttrValue?節(jié)點屬性的值
/************************************************************************/
TiXmlNode?*?SelectSingleNode(string?nodeName,string?nodeAttrName,string?nodeAttrValue)
{
//加載一個XML的文檔對象。
?
TiXmlDocument?*xmlDoc?=?new?TiXmlDocument("Person.xml");
if(!xmlDoc->LoadFile()) //是tinyXml會自動處理文檔的BOM
{
return?NULL;
}
if(xmlDoc?==?NULL)
{
return?NULL;
}
//獲得根元素
TiXmlElement?*RootElement?=?xmlDoc->RootElement();
if(RootElement?==?NULL)
{
cout?<<?"解析錯誤,無法獲取根元素"?<<?endl;
return?NULL;
}
TiXmlNode?*?pNode??=?NULL;
TiXmlNode?*?pSelectNode?=?NULL;
string?msg?=?"";
for(pNode=RootElement->FirstChildElement();pNode;pNode=pNode->NextSiblingElement())
{
?
pSelectNode?=?selectChildNode(pNode,nodeName,nodeAttrName,nodeAttrValue);
if(pSelectNode)
{
break;
}
}
?
if(pSelectNode)
{
cout?<<?"解析成功"?<<?endl;
cout?<<?pSelectNode->Value()?<<?endl;
return?pSelectNode;
}
else
{
cout?<<?"解析錯誤,無法獲取節(jié)點"?<<?endl;
return?NULL;
}
?
}
/************************************************************************/
/*
??根據(jù)父節(jié)點循環(huán)遍歷查找子節(jié)點
??參數(shù)說明
????noteName?節(jié)點名
noteAttrName?屬性名
noteAttrValue?屬性值
/************************************************************************/
TiXmlNode?*?selectChildNode(TiXmlNode?*?pNode,string?nodeName,string?nodeAttrName,string?nodeAttrValue)
{
if(pNode?==?NULL)
{
return?NULL;
}
TiXmlNode?*?pSelectedNode?=?NULL;
TiXmlNode?*?pChildNode?=?NULL;
int?t?=?pNode->Type();
switch?(t)
{
case?TiXmlText::DOCUMENT:
case?TiXmlText::DECLARATION:
case?TiXmlText::TEXT:
case?TiXmlText::UNKNOWN:
case?TiXmlText::COMMENT:
break;
case?TiXmlText::ELEMENT:
if(pNode->Value()?==?nodeName)
{
//cout?<<?pNode->Value()?<<?endl;
if(!nodeAttrName.empty()?&&?!nodeAttrValue.empty())
{
TiXmlElement?*?pElement?=?pNode->ToElement();
?
TiXmlAttribute?*?pAttr?=?pElement->FirstAttribute();
TiXmlAttribute?*?pNextAttr?=NULL;
if(pAttr?!=?NULL)
{
do
{
if(pAttr->Name()==nodeAttrName&&pAttr->Value()==?nodeAttrValue)
{
//cout?<<?pAttr->Value()?<<?endl;
return?pNode;
}
}while(pAttr?=?pAttr->Next());
}
}
else
{
return?pNode;
}
?
}
else
{
//循環(huán)訪問它的每一個元素
for(pChildNode=pNode->FirstChild();
pChildNode!=0;
pChildNode?=?pChildNode->NextSibling())
{
pSelectedNode?=?selectChildNode(
pChildNode,
nodeName,
nodeAttrName,
nodeAttrValue);
if(pSelectedNode)
{
return?pSelectedNode;
}
}
}
default:break;
}
return?NULL;
}
/************************************************************************/
/*?普通插入一個節(jié)點,還不完善。???????????????????????????????????????????????????????????????*/
/************************************************************************/
bool?insert()
{
//加載一個XML的文檔對象。
TiXmlDocument?*myDocument?=?new?TiXmlDocument("Person.xml");
myDocument->LoadFile();
?
if(myDocument?==?NULL)
{
return?false;
}
//獲得xml的頭,即聲明部分
TiXmlDeclaration*?decl?=?myDocument->FirstChild()->ToDeclaration();
if(decl?!=?NULL)
{
cout?<<?"xml文件的版本是:"?<<?decl->Version()?<<?endl;
cout?<<?"xml的編碼格式是:"?<<?decl->Encoding()?<<?endl;
}
?
?
//獲得根元素
TiXmlElement?*RootElement?=?myDocument->RootElement();
????
if(RootElement?!=?NULL)
{
?
//創(chuàng)建一個Person元素并連接。
TiXmlElement?*PersonElement?=?new?TiXmlElement("Person");
PersonElement->SetAttribute("Id",1);
RootElement->LinkEndChild(PersonElement);??
?
TiXmlText?*textElement?=?new?TiXmlText("Jam");
PersonElement->LinkEndChild(textElement);
?
//增加一個team元素
TiXmlElement?*TeamElement?=?new?TiXmlElement("team");
TeamElement->SetAttribute("TID","001");
RootElement->LinkEndChild(TeamElement);
?
//增加team的子節(jié)點name
TiXmlElement?*teamName?=?new?TiXmlElement("name");
TiXmlText?*nameText?=?new?TiXmlText("workgroup");
teamName->LinkEndChild(nameText);
TeamElement->LinkEndChild(teamName);
?
//增加team的子節(jié)點type
TiXmlElement?*teamType?=?new?TiXmlElement("type");
TiXmlText?*typeText?=?new?TiXmlText("SI");
teamType->LinkEndChild(typeText);
?
TeamElement->LinkEndChild(teamType);
?
myDocument->SaveFile("Person.xml");
?
?
//輸出根元素名稱
cout?<<?RootElement->Value()?<<?endl;
return?true;
}
?return?false;
}
?
/************************************************************************/
/*?獲取一個節(jié)點的屬性??????????????????????????????????????????????????*/
/************************************************************************/
string?getAttribute(TiXmlNode?*?pNode)
{
if(pNode?==?NULL)?return?"";
//輸出屬性
string?msg?=?"";
TiXmlElement?*?pElement?=?pNode->ToElement();
?
TiXmlAttribute?*?pAttr?=?pElement->FirstAttribute();
TiXmlAttribute?*?pNextAttr?=NULL;
string?tmpAttrMsg?=?"[";
if(pAttr?!=?NULL)
{
string?tmpAttrVal?=?"";
string?tmpAttrName?=?"";
?
do
{
tmpAttrVal?=?pAttr->Value();
tmpAttrName?=?pAttr->Name();
tmpAttrMsg?+=?tmpAttrName+"="?+?tmpAttrVal+","; //各個屬性之間用逗號分隔
}while(pAttr?=?pAttr->Next());
tmpAttrMsg?=?tmpAttrMsg.erase(tmpAttrMsg.find_last_of(","));
}
tmpAttrMsg?+=?"]";
msg?+=?tmpAttrMsg;
}
?
?
/************************************************************************/
/* 在指定位置插入一個元素 */
/************************************************************************/
bool?insertAElement(TiXmlElement?*?pElement)
{
//加載一個XML的文檔對象。
TiXmlDocument?*xmlDoc?=?new?TiXmlDocument("Person.xml");
xmlDoc->LoadFile();
?
if(xmlDoc?==?NULL) return?false;
//獲得xml的頭,即聲明部分
TiXmlDeclaration*?decl?=?xmlDoc->FirstChild()->ToDeclaration();
if(decl?!=?NULL)
{
cout?<<?"xml文件的版本是:"?<<?decl->Version()??<<?endl;
cout?<<?"xml的編碼格式是:"?<<?decl->Encoding()?<<?endl;
}
//獲得根元素
TiXmlElement?*RootElement?=?xmlDoc->RootElement();
if(RootElement?!=?NULL)
{
TiXmlNode?*?pNode?=?SelectSingleNode(xmlDoc,"name","length","100");
if(pNode?==?NULL)
{
return?false;
}
?
//創(chuàng)建一個Person元素并連接。
TiXmlElement?*pNewElement?=?new?TiXmlElement("Person");
if(pNewElement?==?NULL)
{
return?false;
}
pNewElement->SetAttribute("Id","1");
TiXmlText?*textElement?=?new?TiXmlText("gbnn");
if(textElement?==?NULL)
{
return?false;
}
pNewElement->LinkEndChild(textElement);
TiXmlNode?*?pRet?=?pNode->InsertBeforeChild(pNode->LastChild(),*pNewElement);
//TiXmlNode?*?pRet?=?pNode->LinkEndChild(pNewElement);
xmlDoc->Print();
bool?b?=?xmlDoc->SaveFile();
if(b)
{
cout?<<?"添加成功"?<<?endl;
return?b;
}
else
{
cout?<<?"添加失敗"?<<?endl;
return?false;
}
}
else
{
return?false;
}
}
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/lf2185551/archive/2012/08/08/TinyXML.html
總結(jié)
以上是生活随笔為你收集整理的TinyXML学习记录及整理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Radio stations CodeF
- 下一篇: 记GMIC 2014