使用TinyXml对xml文件进行操作

  • 简介

读取和设置xml配置文件是最常用的操作,TinyXML是一个开源的解析XML的C++解析库,它是目前非常流行的一款基于DOM模型的XML解析器,简单易用且小巧玲珑,非常适合存储简单数据,配置文件,对象序列化等数据量不是很大的操作。

  下载TinyXML的网址:http://www.grinninglizard.com/tinyxml/

  使用TinyXML只需要将其中的6个文件拷贝到项目中就可以直接使用了,这六个文件是:tinyxml.h、tinystr.h、tinystr.cpp、tinyxml.cpp、tinyxmlerror.cpp、tinyxmlparser.cpp。

  • 读取xml
<School name="北大">  
    <Class name = "C++">         
        <Student name="tinyxml" number="123">  
            <email>tinyxml@163.com</email>  
            <address>中国</address>           
        </Student>          
        <Student name="haha" number="456">  
            <email>haha@gmail.com</email>  
            <address>美国</address>           
        </Student>         
    </Class>     
</School>
#include "tinyxml.h"
#include <iostream>
#include <string>
#include <windows.h>

void readXml() 
{
	using namespace std;
	const char * xmlFile = "a.xml";
	TiXmlDocument doc;

	doc.LoadFile(xmlFile);
	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();
			string contactValue = UTF8_To_string(studentContactElement->GetText());
			cout << contactType << " : " << contactValue << std::endl;
		}
	}
}


//vs输出的是gb2312的格式,而xml当前输出的是utf-8,如果不转为gb2312会出现中文乱码
//UTF8转gb2312
std::string UTF8_To_string(const std::string & str)
{
	int nwLen = MultiByteToWideChar(CP_UTF8, 0, str.c_str(), -1, NULL, 0);

	wchar_t * pwBuf = new wchar_t[nwLen + 1];//一定要加1,不然会出现尾巴  
	memset(pwBuf, 0, nwLen * 2 + 2);

	MultiByteToWideChar(CP_UTF8, 0, str.c_str(), str.length(), pwBuf, nwLen);

	int nLen = WideCharToMultiByte(CP_ACP, 0, pwBuf, -1, NULL, NULL, NULL, NULL);

	char * pBuf = new char[nLen + 1];
	memset(pBuf, 0, nLen + 1);

	WideCharToMultiByte(CP_ACP, 0, pwBuf, nwLen, pBuf, nLen, NULL, NULL);

	std::string retStr = pBuf;

	delete[]pBuf;
	delete[]pwBuf;

	pBuf = NULL;
	pwBuf = NULL;

	return retStr;
}
  • 生成xml
  • void writeXml() 
    {
    	using namespace std;
    	const char *xmlFile = "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", "jsoncpp");
    	stu2Element->SetAttribute("number", "456");
    	TiXmlElement * stu2EmailElement = new TiXmlElement("email");
    	stu2EmailElement->LinkEndChild(new TiXmlText("jsoncpp@163.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);
    }

     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值