TinyXml使用方法
标签:
杂谈 |
分类: 学习 |
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; -
newTiXmlDeclaration * decl = TiXmlDeclaration( "1.0","", "" ); -
doc.LinkEndChild( decl ); -
-
newTiXmlElement * element1 = TiXmlElement( "AMULE_ToDL"); //创建元素element1 -
"num",5);element1->SetAttribute( -
doc.LinkEndChild( element1 ); - //
TiXmlText * text = new TiXmlText( "World" );//创建一个文本 - //
element->LinkEndChild( text );//链接 -
-
-
newTiXmlElement * element11 = TiXmlElement( "name"); -
"name","GongFong.rmvb");element11->SetAttribute( -
//链接element11为element1的子节点(子元素)element1->LinkEndChild( element11 ); -
-
newTiXmlElement * element2 = TiXmlElement( "BT_ToDL"); -
"num",10);//创建属性element2->SetAttribute( -
doc.LinkEndChild(element2); -
//dump_to_stdout(&doc); -
"1.xml"doc.SaveFile( ); - }
-
-
- void
dump_to_stdout( //Tixml主页上给的一个遍历方法TiXmlNode* pParent ) - {
-
if( return;!pParent ) -
-
TiXmlNode* pChild; -
TiXmlText* pText; -
intt = pParent->Type(); -
"typeprintf( %d/n" ,t); -
intnum; -
-
switch( t ) -
{ -
caseTiXmlNode::DOCUMENT: -
"Document"printf( ); -
break; -
-
caseTiXmlNode::ELEMENT: -
"Elementprintf( [%s]" ,pParent->Value() ); -
num=dump_attribs_to_stdout(pParent->ToElement(), indent+1); -
switch(num) -
{ -
case0: "printf( (No );attributes)" break; -
case1: "%s1printf( attribute" ,getIndentAlt(indent)); break; -
default:printf( "%s%dattributes" ,getIndentAlt(indent), break;num); -
} -
break; -
-
caseTiXmlNode::COMMENT: -
"Comment:printf( [%s]" ,pParent->Value()); -
break; -
-
caseTiXmlNode::UNKNOWN: -
"Unknown"printf( ); -
break; -
-
caseTiXmlNode::TEXT: -
pText = pParent->ToText(); -
"Text:printf( [%s]" ,pText->Value() ); -
break; -
-
caseTiXmlNode::DECLARATION: -
"Declaration"printf( ); -
break; -
default: -
break; -
} -
"/n"printf( ); -
for( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) -
{ -
dump_to_stdout( pChild ); -
} - }
- void
search(TiXmlNode* //遍历时候,把每个节点都是做一个父节点,即假定其都有子节点ChildNodepParent) - {
-
if( return;!pParent ) -
-
TiXmlNode* pChild= NULL; -
intt //获取此节点的类型= pParent->Type(); -
-
if(TiXmlNode::ELEMENT "Welcome",pParent->Value())== t && (strcmp( == //搜索元素值为"Welcome"的0)) -
{ -
"valueprintf( %s/n" ,pParent->Value());//打印值 -
"re-write");//改变其属性pParent->SetValue( -
"hello",20);pParent->ToElement()->SetAttribute( -
-
newTiXmlElement * element1 = TiXmlElement( "AMULE_ToDL"); //添加一个节点 -
"num",5);element1->SetAttribute( -
pParent->LinkEndChild(element1); -
-
//保存文件pDoc->SaveFile(); -
} -
"/n"printf( ); -
for( pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) -
{ -
search(pChild); -
} -
- }
- void
search2(TiXmlNode* //另一种方法:pParent) - {
-
if( return;!pParent ) -
-
TiXmlNode* pChild= NULL; -
TiXmlNode*tmp = NULL; -
intt = pParent->Type(); -
-
"Window");//搜索元素值为"Window"的节点tmp = pParent->FirstChild( -
if(tmp){ -
-
//pParent->RemoveChild(tmp);//找到后删除此节点 -
-
newTiXmlElement * element1 = TiXmlElement( "AMULE_ToDL"); -
"num",5);element1->SetAttribute( -
-
//找到"AMULE_ToDL"节点后替换此节点pParent->ReplaceChild(tmp,*element1); -
-
} -
-
//保存文件pDoc->SaveFile(); -
-
"/n"printf( ); -
for( //遍历一个节点的所兄弟节点,记着单词sibling是兄弟,pChild = pParent->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) 姐妹的意思 -
//也就是说FirstChild()和NextSibling()不是父节点和子节点的关系 -
{ -
//遍历一个节点的所有子节点search2(pChild); -
} -
- }
- int
main( intargc, char*argv[]) -
{ -
-
TiXmlDocument doc(argv[1]); -
boolloadOkay = doc.LoadFile(); -
if(loadOkay) -
{ -
pDoc = &doc; -
"/n%s:/n",printf( argv[1]); -
//dump_to_stdout(&doc ); // defined later in the tutorial -
//把TiXmlDocument类型的值复制给一个TiXmlNode类型search2(&doc); -
} -
else -
{ -
"Failedprintf( to %s/"/n",load file /" 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;
}

加载中…