TinyXML 的簡單介紹以及使用
先說幾句重點:
1,tinyxml 生成或解析XML非常好用
2,tinyxml 利用DOM(文檔對象模型)操作XML,根節點與各個子節點相當於形成一棵樹
3,只要你了解tinyxml的用法,可以只new對象而不用delete。
4,tinyxml包含6個文件 tinystr.cpp , tinystr.h , tinyxml.cpp , tinyxmlerror.cpp , tinyxml.h , tinyxmlparser.cpp
5,來個官網說明的class inheritance,官網地址:http://www.grinninglizard.com/tinyxmldocs/index.html
This inheritance list is sorted roughly, but not completely, alphabetically:
- TiXmlBase
- TiXmlAttribute
- TiXmlNode
- TiXmlComment
- TiXmlDeclaration
- TiXmlDocument
- TiXmlElement
- TiXmlText
- TiXmlUnknown
- TiXmlHandle
- TiXmlVisitor
- TiXmlPrinter
到了這裏,直接上程序,只要你看完代碼,就會處理最簡單的XML文檔了
#include <stdio.h> #include"tinyxml.h" int CreateXml() { //創建一個XML結構 TiXmlDocument* pDoc = new TiXmlDocument(); //創建一個根節點並連接到XML TiXmlElement* pRoot = new TiXmlElement("item"); pDoc->LinkEndChild(pRoot); //創建一個name子節點並連接根節點下 TiXmlElement* nameElement = new TiXmlElement("name"); pRoot->LinkEndChild(nameElement); nameElement->SetAttribute("ID","1"); TiXmlText* nameContent = new TiXmlText("opop"); nameElement->LinkEndChild(nameContent); TiXmlElement* addrElement = new TiXmlElement("addr"); pRoot->LinkEndChild(addrElement); TiXmlText* addrContent = new TiXmlText("guangzhou"); addrElement->LinkEndChild(addrContent); TiXmlElement* telElement = new TiXmlElement("tel"); pRoot->LinkEndChild(telElement); TiXmlText* telContent = new TiXmlText("1341532545"); telElement->LinkEndChild(telContent); TiXmlElement* emailElement = new TiXmlElement("email"); pRoot->LinkEndChild(emailElement); TiXmlText* emailContent = new TiXmlText("[email protected]"); emailElement->LinkEndChild(emailContent); //保存到文件 pDoc->SaveFile("test.xml"); delete pDoc; //應該是必要的 return 0; } int ReadXml() { //創建一個XML結構並載入文件內容 TiXmlDocument* pDoc = new TiXmlDocument(); pDoc->LoadFile("test.xml"); pDoc->Print(); //獲取根節點 TiXmlElement* pRoot = pDoc->RootElement(); printf("%s\n",pRoot->Value()); //獲取根節點下的子節點並打印其內容 TiXmlElement* pChild = pRoot->FirstChildElement("name"); printf("%s\n",pChild->FirstChild()->ToText()->Value()); pChild = pRoot->FirstChildElement("addr"); printf("%s\n",pChild->FirstChild()->ToText()->Value()); pChild = pRoot->FirstChildElement("tel"); printf("%s\n",pChild->FirstChild()->ToText()->Value()); pChild = pRoot->FirstChildElement("email"); printf("%s\n",pChild->FirstChild()->ToText()->Value()); delete pDoc;//應該是必要的
}
int main() { CreateXml(); ReadXml(); return 0; }
好了,見證奇跡吧
最後再說一個重點:關於delete的問題
代碼裏面很清楚,有delete,但是這個例子的delete是必須的,不然就內存泄露了。
但是註意delete的對象只有一個,其他new的對象如果delete就出問題了,原因後面會講到
怎樣完全不用delete呢?很簡單!!!
請看下面一段官方代碼:只有new,沒有delete
void write_simple_doc2( ) { // same as write_simple_doc1 but add each node // as early as possible into the tree. 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" ); }
Both of these produce the XML:
<?xml version="1.0" ?> <Hello>World</Hello>
對比完應該就發現了,只要代碼中TiXmlDocument 對象不要在堆中new,直接在棧中生成,那麽,就不需要任何delete操作,而且必須不能delete,否則程序就崩了。
原因很簡單,只要TiXmlDocument 對象這個基本結構被銷毀了,所有的節點會被自動銷毀。TinyXML保證不坑你
TinyXML 的簡單介紹以及使用