1. 程式人生 > >TinyXML 的簡單介紹以及使用

TinyXML 的簡單介紹以及使用

lba ror 連接 生成 body 操作xml root style comm

先說幾句重點:

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 的簡單介紹以及使用