首先简单介绍一下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?
- glibc[~]#catexample.cc
- #include"tinyxml.h"
- #include
- usingnamespacestd;
- TiXmlDocument*pDoc=NULL;
- voidwrite_xml()
- {
- TiXmlDocumentdoc;
- TiXmlDeclaration*decl=newTiXmlDeclaration("1.0","","");
- doc.LinkEndChild(decl);
- TiXmlElement*element1=newTiXmlElement("AMULE_ToDL");//创建元素element1
- element1->SetAttribute("num",5);
- doc.LinkEndChild(element1);
- //TiXmlText*text=newTiXmlText("World");//创建一个文本
- //element->LinkEndChild(text);//链接
- TiXmlElement*element11=newTiXmlElement("name");
- element11->SetAttribute("name","GongFong.rmvb");
- element1->LinkEndChild(element11);//链接element11为element1的子节点(子元素)
- TiXmlElement*element2=newTiXmlElement("BT_ToDL");
- element2->SetAttribute("num",10);//创建属性
- doc.LinkEndChild(element2);
- //dump_to_stdout(&doc);
- doc.SaveFile("1.xml");
- }
- voiddump_to_stdout(TiXmlNode*pParent)//Tixml主页上给的一个遍历方法
- {
- if(!pParent)return;
- TiXmlNode*pChild;
- TiXmlText*pText;
- intt=pParent->Type();
- printf("type%d/n",t);
- intnum;
- switch(t)
- {
- caseTiXmlNode::DOCUMENT:
- printf("Document");
- break;
- caseTiXmlNode::ELEMENT:
- printf("Element[%s]",pParent->Value());
- num=dump_attribs_to_stdout(pParent->ToElement(),indent+1);
- switch(num)
- {
- case0:printf("(Noattributes)");break;
- case1:printf("%s1attribute",getIndentAlt(indent));break;
- default:printf("%s%dattributes",getIndentAlt(indent),num);break;
- }
- break;
- caseTiXmlNode::COMMENT:
- printf("Comment:[%s]",pParent->Value());
- break;
- caseTiXmlNode::UNKNOWN:
- printf("Unknown");
- break;
- caseTiXmlNode::TEXT:
- pText=pParent->ToText();
- printf("Text:[%s]",pText->Value());
- break;
- caseTiXmlNode::DECLARATION:
- printf("Declaration");
- break;
- default:
- break;
- }
- printf("/n");
- for(pChild=pParent->FirstChild();pChild!=0;pChild=pChild->NextSibling())
- {
- dump_to_stdout(pChild);
- }
- }
- voidsearch(TiXmlNode*pParent)//遍历时候,把每个节点都是做一个父节点,即假定其都有子节点ChildNode
- {
- if(!pParent)return;
- TiXmlNode*pChild=NULL;
- intt=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=newTiXmlElement("AMULE_ToDL");//添加一个节点
- element1->SetAttribute("num",5);
- pParent->LinkEndChild(element1);
- pDoc->SaveFile();//保存文件
- }
- printf("/n");
- for(pChild=pParent->FirstChild();pChild!=0;pChild=pChild->NextSibling())
- {
- search(pChild);
- }
- }
- voidsearch2(TiXmlNode*pParent)//另一种方法:
- {
- if(!pParent)return;
- TiXmlNode*pChild=NULL;
- TiXmlNode*tmp=NULL;
- intt=pParent->Type();
- tmp=pParent->FirstChild("Window");//搜索元素值为"Window"的节点
- if(tmp){
- //pParent->RemoveChild(tmp);//找到后删除此节点
- TiXmlElement*element1=newTiXmlElement("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);//遍历一个节点的所有子节点
- }
- }
- intmain(intargc,char*argv[])
- {
- TiXmlDocumentdoc(argv[1]);
- boolloadOkay=doc.LoadFile();
- if(loadOkay)
- {
- pDoc=&doc;
- printf("/n%s:/n",argv[1]);
- //dump_to_stdout(&doc);//definedlaterinthetutorial
- search2(&doc);//把TiXmlDocument类型的值复制给一个TiXmlNode类型
- }
- else
- {
- printf("Failedtoloadfile/"%s/"/n",argv[1]);
- }
- return0;
- }
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; }