最近在做毕业论文,可能要使用TinyXML。全是英文看着费劲。所以翻译了一下! 所有翻译后的文件直接被放到网盘中了。如果您需要的话自己去找吧 !网盘地址见我的主页。
网盘中有一个名字叫做《TinyXML文档集合》的word文件。
(1)http://www.grinninglizard.com/tinyxmldocs/index.html 翻译了这个页面上的所有东西
(2)http://www.grinninglizard.com/tinyxmldocs/tutorial0.html翻译了这个页面上的所有东西
TinyXML 基本操作如下,经过VS2013调试,全部能够运行!
#include "iostream"
#include "vector"
#include "string"
#include "list"
#include "deque"
#include "utility"
#include "map"
#include "set"
#include "fstream"
#include "sstream"
#include "algorithm"
#include "numeric"
#include "iterator"
#include "functional"
#include "typeinfo.h"
#include "memory"
#include "exception"
#include "assert.h"
#include
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
#include
using namespace std;
#include
#include
#include "tinyxml.h"
#include "tchar.h"
using namespace std;
//
//
//
// Welcome to MyApp
// Thank you for using MyApp
//
//
//
//
//
//
//创建了一个D:\\yang.xml的文件
//通过指定名字创建一个XML文件。参数是文件的名字。
bool CreateXMLFile(char * FileName)
{
TiXmlDocument * pDoc = new TiXmlDocument;//创建一个文档类型对象,整个XML文档的最上层节点
if (NULL==pDoc)
{
return false;
}
//构造函数
// TiXmlDeclaration(const char* _version,
// const char* _encoding,
// const char* _standalone); standalone脱机,单独,独立
//创造一个声明的类。
TiXmlDeclaration * pDeclaration = new TiXmlDeclaration(("1.0"), (""), (""));
if (NULL==pDeclaration)
{
return false;
}
pDoc->LinkEndChild(pDeclaration);//把pDeclaration做为pDoc的一个孩子节点。
//生成一个根节点:MyApp
TiXmlElement * pRootEle = new TiXmlElement(("MyApp"));
if (NULL==pRootEle)
{
return false;
}
pDoc->LinkEndChild(pRootEle);
//生成子节点:Messages
TiXmlElement * pMsg = new TiXmlElement(("Messages"));
if (NULL==pMsg)
{
return false;
}
pRootEle->LinkEndChild(pMsg);
//生成子节点welcome
TiXmlElement * pWelcome = new TiXmlElement(("Welcome"));
if (NULL==pWelcome)
{
return false;
}
pMsg->LinkEndChild(pWelcome);
//设置Welcome节点的值
const char * strValue = ("Welcome to MyApp");
TiXmlText * pWelcomeValue = new TiXmlText(strValue);
pWelcome->LinkEndChild(pWelcomeValue);
//生成子节点:Farewell
TiXmlElement * pFarewell = new TiXmlElement(("Farewell"));
if (NULL==pFarewell)
{
return false;
}
pMsg->LinkEndChild(pFarewell);
//设置Farewell节点的值
strValue = ("Thank you for using MyApp");
TiXmlText * pFarewellValue = new TiXmlText(strValue);
pFarewell->LinkEndChild(pFarewellValue);
//生成子节点:Windows
TiXmlElement * pWindows = new TiXmlElement(("Windows"));
if (NULL==pWindows)
{
return false;
}
pRootEle->LinkEndChild(pWindows);
//生成子节点:Window
TiXmlElement * pWindow = new TiXmlElement(("Window"));
if (NULL==pWindow)
{
return false;
}
pWindows->LinkEndChild(pWindow);
//设置节点Window的值
pWindow->SetAttribute(("name"), ("MainFrame"));
pWindow->SetAttribute(("x"), ("5"));
pWindow->SetAttribute(("y"), ("15"));
pWindow->SetAttribute(("w"), ("400"));
pWindow->SetAttribute(("h"), ("250"));
//生成子节点connection
TiXmlElement * pConnect = new TiXmlElement(("Connection"));
if (NULL==pConnect)
{
return false;
}
pRootEle->LinkEndChild(pConnect);
//设置节点connection的值
pConnect->SetAttribute(("ip"), ("192.168.0.1"));
pConnect->SetAttribute(("timeout"), ("123.456000"));
pDoc->SaveFile(FileName);
}
//打印整个XML文件中的所有行
bool PintXML(const char * FileName)
{
TiXmlDocument * pDocument = new TiXmlDocument;
if (NULL==pDocument)
{
return false;
}
pDocument->LoadFile(FileName);
pDocument->Print();
}
//获取指向指定名字节点的指针
//三个参数的意思:第一个参数表示一个XML文档中树根节点,strNodeName表示你要查找的节点的名字,第三个参数返回指向找到节点的指针
bool GetNodePointerByName(TiXmlElement * pRootEle, string & strNodeName, TiXmlElement * & Node)
{
//假如等于根节点名字,就退出
if (strNodeName==pRootEle->Value())
{
Node = pRootEle;
return true;
}
TiXmlElement * pEle = pRootEle;
for (pEle = pRootEle->FirstChildElement(); pEle;pEle=pEle->NextSiblingElement())
{
//递归处理子节点,获取节点指针
if (GetNodePointerByName(pEle,strNodeName,Node))
{
return true;
}
}
return false;
}
//通过名字查询一个节点中的文本内容。
//第一个参数是XML文件名字,第二个参数是节点的名字,第三个参数是返回的节点的内容
bool QueryNode_Text(string XmlFile, string strNodeName, string & strText)
{
//定义一个
TiXmlDocument * pDoc = new TiXmlDocument;
if (NULL==pDoc)
{
return false;
}
pDoc->LoadFile(XmlFile.c_str());
TiXmlElement * pRootEle = pDoc->RootElement();
if (NULL==pRootEle)
{
return false;
}
TiXmlElement * pNode = NULL;
GetNodePointerByName(pRootEle, strNodeName, pNode);
if (NULL!=pNode)
{
if (NULL!=pNode->GetText())
{
strText=pNode->GetText();
return true;
}
else
{
cout << "这个节点没有text内容" << endl;
return false;
}
//strText=pNode->GetText();
//注意上面的这条语句,如果这个节点中是没有任何text内容的话,那么就会产生运行时候错误。
//所以如果不想产生运行时错误,那么就要进行一个判断是否为空串。
}
else
{
return false;
}
}
//查询节点属性输入文件名字,节点名字,和一个map。其中最后一个参数map用来保存,若干属性的值。
bool QueryNode_Attribute(string XmlFile, string strNodeName, map & AttMap)
{
typedef pair String_Pair;
TiXmlDocument * pDoc = new TiXmlDocument;//定义一个文档类型
if (NULL==pDoc)
{
return false;
}
pDoc->LoadFile(XmlFile.c_str());
TiXmlElement * pRootEle = pDoc->RootElement();//获取文档的根
if (NULL==pRootEle)
{
return false;
}
TiXmlElement * pNode = NULL;
GetNodePointerByName(pRootEle, strNodeName, pNode);
if (NULL!=pNode)
{
TiXmlAttribute * pAttr = NULL;//创建一个属性类
for (pAttr = pNode->FirstAttribute(); pAttr;pAttr=pAttr->Next())//获取【每一个】属性
{
string strAttName = pAttr->Name();//获取属性的-----键
string strAttValue = pAttr->Value();//获取属性的-----值
AttMap.insert(String_Pair(strAttName, strAttValue));
//把属性的(键---值)对做成String_Pair,然后把String_Pair对插入到Map中,并通过第三个参数的引用返回。
}
}
else
{
return false;
}
return true;
}
//通过节点的名字,在XML文档中,删除指定的节点。注意删除一个节点,不仅仅删除了这个节点,而且会删除它的子孙。
bool DelNode(string XmlFile, string strNodeName)
{
TiXmlDocument * pDoc = new TiXmlDocument;
if (NULL == pDoc)
{
return false;
}
pDoc->LoadFile(XmlFile.c_str());
TiXmlElement * pRootEle = pDoc->RootElement();
if (NULL == pRootEle)
{
return false;
}
TiXmlElement * pNode = NULL;
GetNodePointerByName(pRootEle, strNodeName, pNode);
if (pRootEle == pNode)
{
if (pDoc->RemoveChild(pRootEle))//如果查询的节点是根节点,那么就删除这个节点
{
pDoc->SaveFile(XmlFile.c_str());//删除这个节点之后保存这个新的XML文件
return true;
}
else
{
return false;
}
}//endif
if (NULL != pNode)
{
TiXmlNode * pParNode = pNode->Parent();//找到要删除节点的父节点
if (NULL == pParNode)
{
return false;
}
TiXmlElement * pParentEle = pParNode->ToElement();//把一个Node类型节点转换成为一个Element类型节点
//也就是把一个TiXmlNode类型的节点通过ToElement()调用转换成为TiXmlElement类型节点。
if (NULL != pParentEle)
{
if (pParentEle->RemoveChild(pNode))//调用父节点pParentEle的一个函数RemoveChild,然后删除自己的一个孩子节点pNode
{
pDoc->SaveFile(XmlFile.c_str());
return true;
}
else
{
return false;
}
}
}//endif
else
{
return false;
}
}
//修改节点Text内容的操作
//第一个参数是文件名字,第二个参数是要修改的节点的名字,第三个是修改的新文本
bool ModifyNode_Text(string XmlFile, string strNodeName, string strText)
{
TiXmlDocument * pDoc = new TiXmlDocument;
if (NULL==pDoc)
{
return false;
}
pDoc->LoadFile(XmlFile.c_str());
TiXmlElement * pRootEle = pDoc->RootElement();
if (NULL==pRootEle)
{
return false;
}
TiXmlElement * pNode = NULL;
GetNodePointerByName(pRootEle, strNodeName, pNode);
if (NULL!=pNode)
{
pNode->Clear();//首先清除pNode指针所指向的节点原来的所有文本。
//然后插入文本保存文件
TiXmlText * pValue = new TiXmlText(strText.c_str());
pNode->LinkEndChild(pValue);//创建一个TiXmlText类型的节点,让这个节点作为pNode节点的最后一个孩子。
pDoc->SaveFile(XmlFile.c_str());//修改之后保存整个XML文件。
return true;
}
else
{
return false;
}
}
//通过指定的节点的名字,修改节点的属性值
//第一个参数XML文件的名字,第二个参数节点的名字,第三个参数要修改的属性的值
bool ModifyNode_Attribute(string XmlFile,string strNodeName,map & AttMap)
{
typedef pair String_Pair;
TiXmlDocument * pDoc = new TiXmlDocument;
if (NULL==pDoc)
{
return false;
}
pDoc->LoadFile(XmlFile.c_str());
TiXmlElement * pRootEle = pDoc->RootElement();
if (NULL==pRootEle)
{
return false;
}
TiXmlElement * pNode = NULL;
GetNodePointerByName(pRootEle, strNodeName, pNode);
if (NULL!=pNode)
{
TiXmlAttribute * pAttr = NULL;
string strAttName = ("");//原来这里的代码上是这样的 _T("");但是这样的话编译的时候就会出现错误。
string strAttValue = ("");
for (pAttr = pNode->FirstAttribute(); pAttr;pAttr=pAttr->Next())
{
strAttName = pAttr->Name();
map::iterator iter;
for (iter = AttMap.begin(); iter != AttMap.end();iter++)
{//遍历整个的属性map,如果找到和输入的属性名字相同的属性,那么就把指定的属性值设置成为输入属性的值。
if (strAttName==iter->first)
{
pAttr->SetValue((iter->second).c_str());
}
}
}
pDoc->SaveFile(XmlFile.c_str());
return true;
}
else
{
return false;
}
}
//在指定的节点下面增加一个孩子节点,并且这个新节点可以设置text内容
//第一个参数是XML文档的文件名字,第二个参数是要插入的父节点的名字,第三个参数是新创建的节点的名字,第四个参数是新创建的节点的文本内容
bool AddNode_Text(string XmlFile, string strParNodeName, string strNodeName, string strText)
{
TiXmlDocument * pDoc = new TiXmlDocument;
if (NULL==pDoc)
{
return false;
}
pDoc->LoadFile(XmlFile.c_str());
TiXmlElement * pRootEle = pDoc->RootElement();
if (NULL==pRootEle)
{
return false;
}
TiXmlElement * pNode = NULL;
GetNodePointerByName(pRootEle, strParNodeName, pNode);//首先找到父节点,因为将在这个节点下面插入新创建的子节点
if (NULL!=pNode)
{
//生成子节点
TiXmlElement * pNewNode = new TiXmlElement(strNodeName.c_str());
if (NULL==pNewNode)
{
return false;
}
//设置节点文本,然后插入节点
TiXmlText * pNewValue = new TiXmlText(strText.c_str());
pNewNode->LinkEndChild(pNewValue);//TiXmlNode* LinkEndChild( TiXmlNode* addThis )
pNode->InsertEndChild(*pNewNode);//TiXmlNode* InsertEndChild( const TiXmlNode& addThis ),这个函数的实现调用了InsertEndChild()
pDoc->SaveFile(XmlFile.c_str());
return true;
}
else
{
return false;
}
}
//在指定名字节点下面增加一个节点,并且设置这个节点的属性值
//第一个参数是要操作的XML文件的名字,第二个参数是父节点的名字,第三个参数是新插入的节点的名字,第四个参数是要设置的属性值
bool AddNode_Attribute(string XmlFile, string strParNodeName, string strNodeName, map&AttMap)
{
TiXmlDocument * pDoc = new TiXmlDocument;
if (NULL == pDoc)
{
return false;
}
pDoc->LoadFile(XmlFile.c_str());
TiXmlElement * pRootEle = pDoc->RootElement();
if (NULL==pRootEle)
{
return false;
}
TiXmlElement * pNode = NULL;
GetNodePointerByName(pRootEle, strParNodeName, pNode);
if (NULL!=pNode)
{
TiXmlElement * pNewNode = new TiXmlElement(strNodeName.c_str());
if (NULL==pNewNode)
{
return false;
}
map::iterator iter;
for (iter = AttMap.begin(); iter != AttMap.end();iter++)
{
pNewNode->SetAttribute(iter->first.c_str(), iter->second.c_str());
}
pNode->InsertEndChild(*pNewNode);
pDoc->SaveFile(XmlFile.c_str());
return true;
}
else
{
return false;
}
}
//打印出整个的XML文档
bool PintXML(string FileName)
{
TiXmlDocument *pDoc = new TiXmlDocument();
if (NULL == pDoc)
{
return false;
}
pDoc->LoadFile(FileName.c_str());
pDoc->Print();
getchar();
}
int main(int argc, char * argv[])
{
char * filename = "D:\\yang.xml";
{//块1
//创建一个yang.xml文件
bool result = CreateXMLFile(filename);
if (!result)
{
cout << "出现了错误!" << endl;
}
else
{
cout << "XML文件创建成功" << endl << endl;
}
//打印整个的yang.xml文件
{
PintXML(filename);
}
}//块1结束
{//块2
//在这个yang.xml文件中查找welcome节点,并获取一个指向这个节点的指针,然后输出这个节点的类型。
TiXmlDocument * pDocument = new TiXmlDocument;
if (NULL == pDocument)
{
return false;
}
pDocument->LoadFile(filename);
TiXmlElement * pRoot = pDocument->RootElement();
string strNodeName("Window");
TiXmlElement * pToNode = NULL;
GetNodePointerByName(pRoot, strNodeName, pToNode);
if (pToNode)
{
cout << "\n========================" << endl;
cout << pToNode->Type() << endl;//这里会打印类型1,因为这是一个TiXmlElement类型的对象。
cout << "========================" << endl;
}
// enum NodeType
// {
// TINYXML_DOCUMENT, 0
// TINYXML_ELEMENT, 1
// TINYXML_COMMENT, 2
// TINYXML_UNKNOWN, 3
// TINYXML_TEXT, 4
// TINYXML_DECLARATION, 5
// TINYXML_TYPECOUNT 6
// };
}//块2结束
{//块3
//查找指定名字的节点的内容,然后输出
{
//查询一个节点中的文本内容,[此处查找的Windows节点是没有text内容的,查找不成功]
string strOutput;
string FileName(filename);
string strNodeName("Window");
bool result = QueryNode_Text(FileName, strNodeName, strOutput);
if (result)
{
cout << "\n========================" << endl;
cout << strOutput << endl;
cout << "========================" << endl;
}
}
{
//查询一个节点中的文本内容,[此处查找的Welcome节点是有text内容的,查找成功]
string strOutput;
string FileName(filename);
string strNodeName("Welcome");
bool result = QueryNode_Text(FileName, strNodeName, strOutput);
if (result)
{
cout << "\n========================" << endl;
cout << strOutput << endl;
cout << "========================" << endl;
}
}
}//块3结束
{//块4开始
//通过节点名字查找节点的所有属性。
map AttMap_inPut;
map::iterator iter;
string FileName(filename);
string strNodeName("Window");
bool result = QueryNode_Attribute(FileName, strNodeName, AttMap_inPut);
if (result)
{
for (iter = AttMap_inPut.begin(); iter != AttMap_inPut.end(); ++iter)
{
cout << iter->first << "\t" << iter->second << endl;
}
cout << "========================" << endl;
}
else
{
cout << "读取属性出现错误" << endl;
}
}//块4结束
{//块5开始
//通过节点的名字,在XML文档中,删除指定的节点。
getchar();
string FileName(filename);
string strNodeName("Welcome");
bool result = DelNode(FileName, strNodeName);
if (false == result)
{
cout << "删除节点错误!\n" << endl;
}
else
{
cout << "删除节点成功!\n" << endl;
}
}//块5结束
{//块6开始
//修改指定名字节点的text值。
getchar();
string FileName(filename);
string strNodeName("Farewell");
string strText("This is the lastest text");
bool result = ModifyNode_Text(FileName, strNodeName, strText);
if (!result)
{
cout << "\n修改节点文本信息错误!" << endl;
}
else
{
cout << "\n修改名字为:" << strNodeName << "节点信息为" << strText << endl;
cout << "修改成功!\n" << endl;
}
}//块6结束
{//块7开始
//修改指定名字节点的属性的值
map AttMap_input;
//name="MainFrame" x="5" y="15" w="400" h="250"
AttMap_input.insert(pair("name", "_MainFrame"));
AttMap_input.insert(pair("x", "_5"));
AttMap_input.insert(pair("y", "_15"));
AttMap_input.insert(pair("w", "_400"));
AttMap_input.insert(pair("h", "_250"));
string FileName(filename);
string strNodeName("Window");
bool result = ModifyNode_Attribute(FileName, strNodeName, AttMap_input);
cout << result << endl;
if (!result)
{
cout << "改变属性值操作失败!" << endl;
}
else
{
cout << "改变属性值操作成功!" << endl;
}
}//块7结束
{//块8开始
//在指定名字的节点下面创建一个新的节点。并且设置新的节点的text内容。
string FileName(filename);
string strParNodeName("Windows");
string strNodeName("Window_new");
string strText("This is a new Create Node!");
bool result = AddNode_Text(FileName, strParNodeName, strNodeName, strText);
if (result)
{
cout << "创建指定名字:" << strNodeName << "的新节点成功!" << endl;
}
else
{
cout << "创建节点失败" << endl;
}
}//块8结束
{//块9开始
//插入新的节点并设置节点的属性值。
map AttMap_input;
//name="MainFrame" x="5" y="15" w="400" h="250"
AttMap_input.insert(pair("_name", "_MainFrame"));
AttMap_input.insert(pair("_x", "_5"));
AttMap_input.insert(pair("_y", "_15"));
AttMap_input.insert(pair("_w", "_400"));
AttMap_input.insert(pair("_h", "_250"));
string FileName(filename);
string strParNodeName("MyApp");
string strNodeName("NewAtt");
bool result = AddNode_Attribute(FileName, strParNodeName, strNodeName, AttMap_input);
if (result)
{
cout << "增加新的节点,并设置属性值成功" << endl;
}
else
{
cout << "增加新的节点,并设置属性值失败" << endl;
}
}//块9结束
{//块10,打印出整个的XML文档
string FileName(filename);
PintXML(FileName);
}
getchar();
return 0;
}