• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

c++中用TINYXML解析XML文件

c++ 搞代码 4年前 (2022-01-06) 32次浏览 已收录 0个评论

这篇文章主要介绍了c++中如何用TINYXML解析XML文件,文中案例非常详细,帮助大家更好的了解和学习,感兴趣的朋友可以了解下

TinyXML介绍

最近做一个负载均衡的小项目,需要解析xml配置文件,用到了TinyXML,感觉使用起来很容易,给出一个使用TinyXML进行XML解析的简单例子,很多复杂的应用都可以基于本例子的方法来完成。

TinyXML是一个开源的解析XML的解析库,能够用于C++,能够在Windows或Linux中编译。这个解析库的模型通过解析XML文件,然后在内存中生成DOM模型,从而让我们很方便的遍历这棵XML树。

DOM模型即文档对象模型,是将整个文档分成多个元素(如书、章、节、段等),并利用树型结构表示这些元素之间的顺序关系以及嵌套包含关系。

TinyXML类说明

在TinyXML中,根据XML的各种元素来定义了一些类:

TiXmlBase:整个TinyXML模型的基类。

TiXmlAttribute:对应于XML中的元素的属性。

TiXmlNode:对应于DOM结构中的节点。

TiXmlComment:对应于XML中的注释。

TiXmlDeclaration:对应于XML中的申明部分,即。

TiXmlDocument:对应于XML的整个文档。

TiXmlElement:对应于XML的元素。

TiXmlText:对应于XML的文字部分。

TiXmlUnknown:对应于XML的未知部分。

TiXmlHandler:定义了针对XML的一些操作。

下载和编译

下载地址:http://sourceforge.net/projects/tinyxml/

工作目录为:

 tinyxml/      //工作目录 |-- include    //头文件根目录 |  |-- tinyxml  //tinyxml头文件,包括tinystr.h tinyxml.h |-- src      //cpp源码文件根目录   |-- tinyxml    //tinyxml源码文件夹,包括tinystr.cpp tinyxml.cpp tinyxmlerror.cpp tinyxmlparser.cpp   |-- main.cpp  //我们的主函数,调用tinyxml的示例代码 |-- conf      //我们示例中用的xml文件所在的文件夹 |-- makefile    //makefile,不用我们多说了吧,不懂请看我博客的makefile最佳实践

简单的例子

在conf目录下建立student.xml代码

    [email protected]中国</address> [email protected]美国</address>

想要使用tinyxml,只需要在头文件中包含即可

读取整个xml文件并打印代码:

 void printSchoolXml() { using namespace std; TiXmlDocument doc; const char * xmlFile = "conf/school.xml"; if (doc.LoadFile(xmlFile)) { doc.Print(); } else { cout << "can not parse xml conf/school.xml" << endl; } }

读取XML

 void readSchoolXml() { using namespace std; const char * xmlFile = "conf/school.xml"; TiXmlDocument doc; if (doc.LoadFile(xmlFile)) { doc.Print(); } else { cout << "can not parse xml conf/school.xml" <FirstChildElement(); // Class元素 TiXmlElement* studentElement = classElement->FirstChildElement(); //Students for (; studentElement != NULL; studentElement = studentElement->NextSiblingElement() ) { TiXmlAttribute* attributeOfStudent = studentElement->FirstAttribute(); //获得student的name属性 for (;attributeOfStudent != NULL; attributeOfStudent = attributeOfStudent->Next() ) { cout <Name() << " : " <Value() <FirstChildElement();//获得student的第一个联系方式 for (; studentContactElement != NULL; studentContactElement = studentContactElement->NextSiblingElement() ) { string contactType = studentContactElement->Value(); string contactValue = studentContactElement->GetText(); cout << contactType << " : " << contactValue << std::endl; } } }

写入xml

 void writeSchoolXml() { using namespace std; const char * xmlFile = "conf/school-write.xml"; TiXmlDocument doc; TiXmlDeclaration * decl = new TiXmlDeclaration("1.0", "", ""); TiXmlElement * schoolElement = new TiXmlElement( "School" ); TiXmlElement *<i style="color:transparent">来源gaodai$ma#com搞$$代**码)网</i> classElement = new TiXmlElement( "Class" ); classElement->SetAttribute("name", "C++"); TiXmlElement * stu1Element = new TiXmlElement("Student"); stu1Element->SetAttribute("name", "tinyxml"); stu1Element->SetAttribute("number", "123"); TiXmlElement * stu1EmailElement = new TiXmlElement("email"); stu1EmailElement->LinkEndChild(new TiXmlText("[email protected]") ); TiXmlElement * stu1AddressElement = new TiXmlElement("address"); stu1AddressElement->LinkEndChild(new TiXmlText("中国")); stu1Element->LinkEndChild(stu1EmailElement); stu1Element->LinkEndChild(stu1AddressElement); TiXmlElement * stu2Element = new TiXmlElement("Student"); stu2Element->SetAttribute("name", "jsoncpp"); stu2Element->SetAttribute("number", "456"); TiXmlElement * stu2EmailElement = new TiXmlElement("email"); stu2EmailElement->LinkEndChild(new TiXmlText("[email protected]")); TiXmlElement * stu2AddressElement = new TiXmlElement("address"); stu2AddressElement->LinkEndChild(new TiXmlText("美国")); stu2Element->LinkEndChild(stu2EmailElement); stu2Element->LinkEndChild(stu2AddressElement); classElement->LinkEndChild(stu1Element); classElement->LinkEndChild(stu2Element); schoolElement->LinkEndChild(classElement); doc.LinkEndChild(decl); doc.LinkEndChild(schoolElement); doc.SaveFile(xmlFile); }

XML删除操作

删除某个节点, TiXmlNode是TiXmlElement、TiXmlComment、TiXmlText、TiXmlDeclaration、TiXmlUnknown、

TiXmlDocument的基类

 TiXmlNode node; node.Clear();

从A节点上移除子节点B

 TiXmlNode nodeA; nodeA. RemoveChild( TiXmlNode* removeThis );

从元素A上移除名字为B的属性

 TiXmlAttribute attrA; attrA. RemoveAttribute( const char * name );

XML修改操作

查找内容为现需要将1234改成其他值

 TiXmlNode* lpnode = NULL; lpnode = tixml.RootElement()->IterateChildren("mfid",lpnode); TiXmlAttribute* tiattr = lpnode->ToElement()->FirstAttribute(); //找到mfid节点,获取第一个属性值。注意,如果有多个属性值,需要判断哪个属性值是需要的 tiattr->SetValue(mfid.c_str());

替换一个节点

 TiXmlNode* ReplaceChild( TiXmlNode* replaceThis, const TiXmlNode& withThis );

以上就是c++中用TINYXML解析XML文件的详细内容,更多关于c++ tinyxml解析XML的资料请关注gaodaima搞代码网其它相关文章!

以上就是c++中用TINYXML解析XML文件的详细内容,更多请关注gaodaima搞代码网其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:c++中用TINYXML解析XML文件

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址