1、TinyXml源代码只有4个cpp文件和2个头文件。
2、首先要理解TinyXml中的各个基本类型之间的关系,看看这个继承图大家就会很明白了!
3、Document就是整个Xml文档,Comment就是里面的注释,原始类似于HTML中的tag。
4、要理解TinyXml中的每个节点都可能是另一个节点的父节点这个很重要,因此遍历TinyXml文档要用递归的方法。每个节点都可能有属性,文本什么的!
5、每个type of TiXmlNode节点的值'value'对应如下 :
DOCUMENT, ELEMENT, COMMENT, UNKNOWN, TEXT, and DECLARATION
7、TinyXml的在线文档和主页:
http://www.grinninglizard.com/tinyxmldocs/index.html
8、常用操作详解:
- 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; }