TinyXml使用方法 tinyxml2

本文用一个详细的例子说明了TiXml的使用方法。如写、查找、插入、替换、加载、遍历等常见操作。

首先简单介绍一下TinyXml,要看详细的在网上搜搜了^_^:

1、TinyXml源代码只有4个cpp文件和2个头文件。

2、首先要理解TinyXml中的各个基本类型之间的关系,看看这个继承图大家就会很明白了!

可以看到TinyXml中的注释comment,声明declaration,元素element,文本等都是节点Node的子类,也就是说可以把XMl文件中的各个元素当做节点来处理。Node类型也有到各个子类之间的转换方法,如ToElement()转换成元素,ToDocument转换成文档等。

因此可以吧TiXmlNode作为TinyXml的基本数据类型来操作,这样转化到其他类型也比较方便!

3、Document就是整个Xml文档,Comment就是里面的注释,原始类似于HTML中的tag。

如就是一个空元素。

如 你好,其中attr1 arrt2就是ele元素的属性,"hello"和"world"分别是相应属性的值,最后字符串“你好”就是此节点的一个文本text。

4、要理解TinyXml中的每个节点都可能是另一个节点的父节点这个很重要,因此遍历TinyXml文档要用递归的方法。每个节点都可能有属性,文本什么的!

5、每个type of TiXmlNode节点的值'value'对应如下 :

Document: filename of the xml file

Element: name of the element

Comment: the comment text

Unknown: the tag contents

Text: the text string

6、TinyXml中Node的类型types是一个枚举类型,其成员如下:

DOCUMENT, ELEMENT, COMMENT, UNKNOWN, TEXT, and DECLARATION
7、TinyXml的在线文档和主页:
http://www.grinninglizard.com/tinyxmldocs/index.html
8、常用操作详解:
[cpp] viewplaincopyprint?
  1. glibc[~]#catexample.cc
  2. #include"tinyxml.h"
  3. #include
  4. usingnamespacestd;
  5. TiXmlDocument*pDoc=NULL;
  6. voidwrite_xml()
  7. {
  8. TiXmlDocumentdoc;
  9. TiXmlDeclaration*decl=newTiXmlDeclaration("1.0","","");
  10. doc.LinkEndChild(decl);
  11. TiXmlElement*element1=newTiXmlElement("AMULE_ToDL");//创建元素element1
  12. element1->SetAttribute("num",5);
  13. doc.LinkEndChild(element1);
  14. //TiXmlText*text=newTiXmlText("World");//创建一个文本
  15. //element->LinkEndChild(text);//链接
  16. TiXmlElement*element11=newTiXmlElement("name");
  17. element11->SetAttribute("name","GongFong.rmvb");
  18. element1->LinkEndChild(element11);//链接element11为element1的子节点(子元素)
  19. TiXmlElement*element2=newTiXmlElement("BT_ToDL");
  20. element2->SetAttribute("num",10);//创建属性
  21. doc.LinkEndChild(element2);
  22. //dump_to_stdout(&doc);
  23. doc.SaveFile("1.xml");
  24. }
  25. voiddump_to_stdout(TiXmlNode*pParent)//Tixml主页上给的一个遍历方法
  26. {
  27. if(!pParent)return;
  28. TiXmlNode*pChild;
  29. TiXmlText*pText;
  30. intt=pParent->Type();
  31. printf("type%d/n",t);
  32. intnum;
  33. switch(t)
  34. {
  35. caseTiXmlNode::DOCUMENT:
  36. printf("Document");
  37. break;
  38. caseTiXmlNode::ELEMENT:
  39. printf("Element[%s]",pParent->Value());
  40. num=dump_attribs_to_stdout(pParent->ToElement(),indent+1);
  41. switch(num)
  42. {
  43. case0:printf("(Noattributes)");break;
  44. case1:printf("%s1attribute",getIndentAlt(indent));break;
  45. default:printf("%s%dattributes",getIndentAlt(indent),num);break;
  46. }
  47. break;
  48. caseTiXmlNode::COMMENT:
  49. printf("Comment:[%s]",pParent->Value());
  50. break;
  51. caseTiXmlNode::UNKNOWN:
  52. printf("Unknown");
  53. break;
  54. caseTiXmlNode::TEXT:
  55. pText=pParent->ToText();
  56. printf("Text:[%s]",pText->Value());
  57. break;
  58. caseTiXmlNode::DECLARATION:
  59. printf("Declaration");
  60. break;
  61. default:
  62. break;
  63. }
  64. printf("/n");
  65. for(pChild=pParent->FirstChild();pChild!=0;pChild=pChild->NextSibling())
  66. {
  67. dump_to_stdout(pChild);
  68. }
  69. }
  70. voidsearch(TiXmlNode*pParent)//遍历时候,把每个节点都是做一个父节点,即假定其都有子节点ChildNode
  71. {
  72. if(!pParent)return;
  73. TiXmlNode*pChild=NULL;
  74. intt=pParent->Type();//获取此节点的类型
  75. if(TiXmlNode::ELEMENT==t&&(strcmp("Welcome",pParent->Value())==0))//搜索元素值为"Welcome"的
  76. {
  77. printf("value%s/n",pParent->Value());//打印值
  78. pParent->SetValue("re-write");//改变其属性
  79. pParent->ToElement()->SetAttribute("hello",20);
  80. TiXmlElement*element1=newTiXmlElement("AMULE_ToDL");//添加一个节点
  81. element1->SetAttribute("num",5);
  82. pParent->LinkEndChild(element1);
  83. pDoc->SaveFile();//保存文件
  84. }
  85. printf("/n");
  86. for(pChild=pParent->FirstChild();pChild!=0;pChild=pChild->NextSibling())
  87. {
  88. search(pChild);
  89. }
  90. }
  91. voidsearch2(TiXmlNode*pParent)//另一种方法:
  92. {
  93. if(!pParent)return;
  94. TiXmlNode*pChild=NULL;
  95. TiXmlNode*tmp=NULL;
  96. intt=pParent->Type();
  97. tmp=pParent->FirstChild("Window");//搜索元素值为"Window"的节点
  98. if(tmp){
  99. //pParent->RemoveChild(tmp);//找到后删除此节点
  100. TiXmlElement*element1=newTiXmlElement("AMULE_ToDL");
  101. element1->SetAttribute("num",5);
  102. pParent->ReplaceChild(tmp,*element1);//找到"AMULE_ToDL"节点后替换此节点
  103. }
  104. pDoc->SaveFile();//保存文件
  105. printf("/n");
  106. for(pChild=pParent->FirstChild();pChild!=0;pChild=pChild->NextSibling())//遍历一个节点的所兄弟节点,记着单词sibling是兄弟,姐妹的意思
  107. //也就是说FirstChild()和NextSibling()不是父节点和子节点的关系
  108. {
  109. search2(pChild);//遍历一个节点的所有子节点
  110. }
  111. }
  112. intmain(intargc,char*argv[])
  113. {
  114. TiXmlDocumentdoc(argv[1]);
  115. boolloadOkay=doc.LoadFile();
  116. if(loadOkay)
  117. {
  118. pDoc=&doc;
  119. printf("/n%s:/n",argv[1]);
  120. //dump_to_stdout(&doc);//definedlaterinthetutorial
  121. search2(&doc);//把TiXmlDocument类型的值复制给一个TiXmlNode类型
  122. }
  123. else
  124. {
  125. printf("Failedtoloadfile/"%s/"/n",argv[1]);
  126. }
  127. return0;
  128. }
glibc[~]# cat example.cc #include "tinyxml.h"#include using namespace std;TiXmlDocument *pDoc =NULL;void write_xml( )    {        TiXmlDocument doc;        TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );        doc.LinkEndChild( decl );        TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );//创建元素element1        element1->SetAttribute("num",5);        doc.LinkEndChild( element1 );//      TiXmlText * text = new TiXmlText( "World" );//创建一个文本//      element->LinkEndChild( text );//链接        TiXmlElement * element11 = new TiXmlElement( "name" );        element11->SetAttribute("name","GongFong.rmvb");        element1->LinkEndChild( element11 );//链接element11为element1的子节点(子元素)        TiXmlElement * element2 = new TiXmlElement( "BT_ToDL" );        element2->SetAttribute("num",10);//创建属性        doc.LinkEndChild(element2);    //dump_to_stdout(&doc);        doc.SaveFile( "1.xml" );}void dump_to_stdout( TiXmlNode* pParent )//Tixml主页上给的一个遍历方法{        if ( !pParent ) return;        TiXmlNode* pChild;        TiXmlText* pText;        int t = pParent->Type();        printf( "type %d/n", t);        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 );        }}void search(TiXmlNode* pParent)//遍历时候,把每个节点都是做一个父节点,即假定其都有子节点ChildNode{       if ( !pParent ) return;              TiXmlNode* pChild= NULL;           int t = pParent->Type();//获取此节点的类型       if (TiXmlNode::ELEMENT == t && (strcmp("Welcome",pParent->Value()) == 0))//搜索元素值为"Welcome"的        {           printf("value %s/n",pParent->Value());//打印值           pParent->SetValue("re-write");//改变其属性           pParent->ToElement()->SetAttribute("hello",20);           TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );//添加一个节点               element1->SetAttribute("num",5);               pParent->LinkEndChild(element1);           pDoc->SaveFile(); //保存文件                      }    printf( "/n" );    for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling())         {            search(pChild);    }      }void search2(TiXmlNode* pParent)//另一种方法:{       if ( !pParent ) return;              TiXmlNode* pChild= NULL;       TiXmlNode*tmp = NULL;           int t = pParent->Type();       tmp = pParent->FirstChild("Window");//搜索元素值为"Window"的节点       if(tmp){              //pParent->RemoveChild(tmp);//找到后删除此节点                   TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );           element1->SetAttribute("num",5);       pParent->ReplaceChild(tmp,*element1);//找到"AMULE_ToDL"节点后替换此节点              }       pDoc->SaveFile(); //保存文件                           printf( "/n" );    for ( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) //遍历一个节点的所兄弟节点,记着单词sibling是兄弟, 姐妹的意思                                                                                                                                //也就是说FirstChild()和NextSibling()不是 父节点和子节点的关系    {            search2(pChild);//遍历一个节点的所有子节点    }      }int main(int argc, char* argv[])   {        TiXmlDocument doc(argv[1]);        bool loadOkay = doc.LoadFile();        if (loadOkay)        {            pDoc = &doc;                printf("/n%s:/n", argv[1]);                //dump_to_stdout( &doc ); // defined later in the tutorial                search2(&doc);                //把TiXmlDocument类型的值复制给一个TiXmlNode类型        }        else        {                printf("Failed to load file /"%s/"/n", argv[1]);        }       return 0;   }

TinyXml使用方法 tinyxml2

  

爱华网本文地址 » http://www.413yy.cn/a/25101016/289366.html

更多阅读

香水使用方法如何正确使用香水 擦香水的正确方法

香水使用方法如何正确使用香水——简介现在都市生活的人,出门的时候,在身上喷点香水以给别人留下好点的印象,但是你知道香水的正确使用方法吗?香水使用方法如何正确使用香水——方法/步骤香水使用方法如何正确使用香水 1、香水如何使用

安全套正确使用方法 女用避孕套

?避孕套的正确使用方法  1、小心地打开包装,不要撕破避孕套,不要使用已损伤的避孕套。??? 2、每次过性生活时使用一只新的避孕套。  3、在阴茎勃起后,插入阴道之前就应将避孕套戴在阴茎上。?  4、在往阴茎上戴之前,不要事先

nero使用方法 刻录软件nero9如何使用

nero使用方法——简介 说到刻录,很多人都知道nero刻录软件。它可以刻录和复制CD、DVD和Blu-ray Discs等,还附带有很多程序,确实很强大。但做为新手就比较难懂nero使用方法了。今天分享刻录软件Nero使用方法给好奇心强又超级想学的朋友:

谷歌卫星地图下载助手使用方法 谷歌地图下载助手软件

谷歌卫星地图下载助手使用方法——简介在工作学习工作中会遇到卫星地图下载的问题,各个公司提供的地图很多,Google地图使用的较多,下面就Google卫星地图下载助手软件使用方法做个介绍,操作非常简单,总共需要五步骤即可完成。谷歌卫星地

声明:《TinyXml使用方法 tinyxml2》为网友继以夏澈于心分享!如侵犯到您的合法权益请联系我们删除