TinyXml使用方法

TinyXml使用方法

(2012-11-15 12:50:02)
标签:

杂谈

分类: XML
本文用一个详细的例子说明了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、常用操作详解:
 
 
  1. glibc[~]# cat example.cc
  2. #include "tinyxml.h"
  3. #include
  4. using namespace std;
  5. TiXmlDocument *pDoc =NULL;
  6. void write_xml( )
  7. {
  8. TiXmlDocument doc;
  9. TiXmlDeclaration * decl = new TiXmlDeclaration( "1.0", "", "" );
  10. doc.LinkEndChild( decl );
  11. TiXmlElement * element1 = new TiXmlElement( "AMULE_ToDL" );//创建元素element1
  12. element1->SetAttribute("num",5);
  13. doc.LinkEndChild( element1 );
  14. // TiXmlText * text = new TiXmlText( "World" );//创建一个文本
  15. // element->LinkEndChild( text );//链接
  16. TiXmlElement * element11 = new TiXmlElement( "name" );
  17. element11->SetAttribute("name","GongFong.rmvb");
  18. element1->LinkEndChild( element11 );//链接element11为element1的子节点(子元素)
  19. TiXmlElement * element2 = new TiXmlElement( "BT_ToDL" );
  20. element2->SetAttribute("num",10);//创建属性
  21. doc.LinkEndChild(element2);
  22. //dump_to_stdout(&doc);
  23. doc.SaveFile( "1.xml" );
  24. }
  25. void dump_to_stdout( TiXmlNode* pParent )//Tixml主页上给的一个遍历方法
  26. {
  27. if ( !pParent ) return;
  28. TiXmlNode* pChild;
  29. TiXmlText* pText;
  30. int t = pParent->Type();
  31. printf( "type %d/n", t);
  32. int num;
  33. switch ( t )
  34. {
  35. case TiXmlNode::DOCUMENT:
  36. printf( "Document" );
  37. break;
  38. case TiXmlNode::ELEMENT:
  39. printf( "Element [%s]", pParent->Value() );
  40. num=dump_attribs_to_stdout(pParent->ToElement(), indent+1);
  41. switch(num)
  42. {
  43. case 0: printf( " (No attributes)"); break;
  44. case 1: printf( "%s1 attribute", getIndentAlt(indent)); break;
  45. default: printf( "%s%d attributes", getIndentAlt(indent), num); break;
  46. }
  47. break;
  48. case TiXmlNode::COMMENT:
  49. printf( "Comment: [%s]", pParent->Value());
  50. break;
  51. case TiXmlNode::UNKNOWN:
  52. printf( "Unknown" );
  53. break;
  54. case TiXmlNode::TEXT:
  55. pText = pParent->ToText();
  56. printf( "Text: [%s]", pText->Value() );
  57. break;
  58. case TiXmlNode::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. void search(TiXmlNode* pParent)//遍历时候,把每个节点都是做一个父节点,即假定其都有子节点ChildNode
  71. {
  72. if ( !pParent ) return;
  73. TiXmlNode* pChild= NULL;
  74. int t = 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 = new TiXmlElement( "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. void search2(TiXmlNode* pParent)//另一种方法:
  92. {
  93. if ( !pParent ) return;
  94. TiXmlNode* pChild= NULL;
  95. TiXmlNode*tmp = NULL;
  96. int t = pParent->Type();
  97. tmp = pParent->FirstChild("Window");//搜索元素值为"Window"的节点
  98. if(tmp){
  99. //pParent->RemoveChild(tmp);//找到后删除此节点
  100. TiXmlElement * element1 = new TiXmlElement( "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. int main(int argc, char* argv[])
  113. {
  114. TiXmlDocument doc(argv[1]);
  115. bool loadOkay = doc.LoadFile();
  116. if (loadOkay)
  117. {
  118. pDoc = &doc;
  119. printf("/n%s:/n", argv[1]);
  120. //dump_to_stdout( &doc ); // defined later in the tutorial
  121. search2(&doc); //把TiXmlDocument类型的值复制给一个TiXmlNode类型
  122. }
  123. else
  124. {
  125. printf("Failed to load file /"%s/"/n", argv[1]);
  126. }
  127. return 0;
  128. }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值