解析XML很常见的功能,网上库也很多,有的大有的小,有的用起来方便有的繁琐。博主测试了几个库,最后用这了这个库,分享出来。
TinyXML,能百度到很多使用的demo代码,用起来确实很方便,我附件里面的是单文件版,只有一个.hpp(就是.h),直接include后就能使用。
点击下载:tinyXML.hpp.gz
顺便贴一个很好的使用实例:
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);//遍历一个节点的所有子节点
}
}