解析XML很常见的功能,网上库也很多,有的大有的小,有的用起来方便有的繁琐。博主测试了几个库,最后用这了这个库,分享出来。
TinyXML,能百度到很多使用的demo代码,用起来确实很方便,我附件里面的是单文件版,只有一个.hpp(就是.h),直接include后就能使用。
点击下载:tinyXML.hpp.gz
顺便贴一个很好的使用实例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 | 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); //遍历一个节点的所有子节点 } } |