zoukankan      html  css  js  c++  java
  • [置顶] C++之TinyXML的使用介绍


    一.引子:


    最近在做GBT28181国标平台对接的工作,涉及到一些进程间消息通讯,消息体有xml格式,之前测试的时候都是拿他们当做字符串去解析,现在正儿八经地开发的时候,就想到了用xml库去解析,由于之前在HW最后一个项目用到的xml库就是这个,所以这里延续使用它。总体来说还是比较好用的:


    二.编译、使用:


           源码库下载:http://sourceforge.net/projects/tinyxml/files/latest/download

          Windows下使用方法:1.直接用其VS工程进行编译生成lib库,2.拷贝源码到自己工程中使用。我这里选择了第二种,主要是以后想自己看看这块的源码,并且程序容易debug。

         1. 将tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp拷贝到自己的工程里

         2. 引入头文件tinystr.h、tinyxml.h

         3.直接编译使用;

         

    三.介绍:


    在TinyXML中,根据XML的各种元素来定义了一些类:
    TiXmlBase:整个TinyXML模型的基类。
    TiXmlAttribute:对应于XML中的元素的属性。
    TiXmlNode:对应于DOM结构中的节点。
    TiXmlComment:对应于XML中的注释。
    TiXmlDeclaration:对应于XML中的申明部分,即<?versiong="1.0" ?>。
    TiXmlDocument:对应于XML的整个文档。
    TiXmlElement:对应于XML的元素。
    TiXmlText:对应于XML的文字部分。
    TiXmlUnknown:对应于XML的未知部分。 
    TiXmlHandler:定义了针对XML的一些操作。


    四.代码示例:

    xml:

    void readXml() {
    	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" << endl;
    		return;
    	}
    	TiXmlElement* rootElement = doc.RootElement();  //School元素  
    	TiXmlElement* classElement = rootElement->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 << attributeOfStudent->Name() << " : " << attributeOfStudent->Value() << std::endl;  
    		}
    
    		TiXmlElement* studentContactElement = studentElement->FirstChildElement();//获得student的第一个联系方式 
    		for (; studentContactElement != NULL; studentContactElement = studentContactElement->NextSiblingElement() ) {
    			string contactType = studentContactElement->Value();
    			string contactValue = studentContactElement->GetText();
    			cout << contactType  << " : " << contactValue << std::endl;  
    		}
    
    	}  
    }
    
    


    写xml:

    void writeXml() {
    	using namespace std;
    	const char * xmlFile = "conf/school-write.xml";	
    	TiXmlDocument doc;  
    	TiXmlDeclaration * decl = new TiXmlDeclaration("1.0", "", "");  
    	TiXmlElement * schoolElement = new TiXmlElement( "School" );  
    	TiXmlElement * 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("tinyxml@163.com") );
    	TiXmlElement * stu1AddressElement = new TiXmlElement("address");
    	stu1AddressElement->LinkEndChild(new TiXmlText("合肥"));
    	stu1Element->LinkEndChild(stu1EmailElement);
    	stu1Element->LinkEndChild(stu1AddressElement);
    
    	TiXmlElement * stu2Element = new TiXmlElement("Student");
    	stu2Element->SetAttribute("name", "feilong");
    	stu2Element->SetAttribute("number", "123");
    	TiXmlElement * stu2EmailElement = new TiXmlElement("email");
    	stu2EmailElement->LinkEndChild(new TiXmlText("feilongxx@gmail.com"));
    	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);  
    }



  • 相关阅读:
    【动画技巧】在Flash中自定义鼠标外观
    【动画技巧】GIF动画转SWF小技巧
    SQL Server 2008空间数据应用系列十一:提取MapInfo地图数据中的空间数据解决方案
    SQL Server 2008空间数据应用系列十:使用存储过程生成GeoRSS聚合空间信息
    jQuery的模板与数据绑定插件
    ASP.NET MVC 入门5、View与ViewData
    一个jQuery写的虚拟键盘
    ASP.NET MVC 入门4、Controller与Action
    使用XML文件来动态配置ASP.NET MVC的Route规则
    ASP.NET MVC 入门9、Action Filter 与 内置的Filter实现(介绍)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3196543.html
Copyright © 2011-2022 走看看