使用ZenXML处理XML文档

XML文档已经成为了任何软件设计中不可或缺的部分,而怎样简单高效的处理XML文档则是一个设计的关键之处。

虽然libXML、Expat等XML库能够很好的处理XML文档,不过ZenXML也有其独到之处,下面就来看看如何使用ZenXML来处理XML文档吧。

不同于别的XML库,ZenXML只有一些头文件,而没有C或者CPP的文件,在使用的时候,只需要包含xml.h就足够了。

1、如何从XML文档读取内容

zen::XmlDoc CXMLUtils::LoadXmlFromFile( const char *sFilename,bool bReuseStrings )
{
	zen::XmlDoc doc;

	try
	{
		doc = zen::load(sFilename);
	}
	catch (const zen::XmlError& e)
	{
		gSystem->FaltalError("XML File Load Error : %s \n",sFilename,e);
	}

	return doc;
}

2、如何从XmlDoc获得所需的数据

	// 从XML文件读取配置
	zen::XmlIn inConfig(xmlDoc);

	inConfig["Window"]["WindowName"](m_WindowName);
	inConfig["Window"]["StartPosition"](m_WindowStartPosition);
	inConfig["Window"]["WindowSize"](m_WindowSize);
	inConfig["Window"]["StereoType"](m_WindowStereoType);
	inConfig["Window"]["FullScreen"](m_WindowFullScreen);

	inConfig["Engine"]["Render"]["RenderType"](m_RenderType);

3、如何向XmlDoc写入数据并保存到磁盘

	zen::XmlDoc sysConfig;
	zen::XmlOut out(sysConfig);

	out["Window"]["WindowName"]("TEngine Window");
	out["Window"]["StartPosition"](glm::vec2(100,100));
	out["Window"]["WindowSize"](glm::vec2(1024,768));
	out["Window"]["StereoType"](StereoNone);
	out["Window"]["FullScreen"](false);

	out["Engine"]["Render"]["RenderType"](OpenGL4X);

	try 
	{     
		zen::save(sysConfig,"System.cfg"); //throw zen::XmlFileError 
	} 
	catch (const zen::XmlFileError& e) 
	{
		gSystem->FaltalError("XML File Create Error : %s \n","System.cfg",e);
	}

4、如何将XmlDoc保存为二进制XML

zen::XmlDoc doc;
std::string stream = serialize(doc); //throw () 
/* you now have a binary XML stream */
saveStream(stream,"file.xml"); //throw XmlFileError  

5、如何对自定义的枚举类型进行读写

enum StereoType
{
	StereoNone,QuatBufferStereo,LeftRightStereo,UpDownStereo,RedBlueStereo
};

        
namespace zen
{	// StereoType
	template <> inline void writeText(const StereoType& value,std::string& output)
	{    
		switch (value)     
		{
		case StereoNone: output = "StereoNone";
			break;         
		case QuatBufferStereo: output = "QuatBufferStereo";
			break;
		case LeftRightStereo:   output = "LeftRightStereo";
			break;
		case UpDownStereo:   output = "UpDownStereo"; 
			break;
		case RedBlueStereo:   output = "RedBlueStereo";
			break;
		}
	}

	template <>	inline bool readText(const std::string& input,StereoType& value)
	{
		std::string tmp = input;
		zen::trim(tmp);
		if (tmp == "StereoNone")
			value = StereoNone;
		else if (tmp == "QuatBufferStereo")
			value = QuatBufferStereo;
		else if (tmp == "LeftRightStereo")
			value = LeftRightStereo;
		else if (tmp == "UpDownStereo")
			value = UpDownStereo;
		else if (tmp == "RedBlueStereo")
			value = RedBlueStereo;
		else
			return false;
		return true;
	}
}

6、如何对自定义Struct进行读写

	// glm::vec4
	template <>	inline void writeStruc(const glm::vec4& value,XmlElement& output)
	{
		XmlOut out(output);
		out["x"](value.x);
		out["y"](value.y);
		out["z"](value.z);
		out["w"](value.w);
	}

	template <>	inline bool readStruc(const XmlElement& input,glm::vec4& value)
	{
		XmlIn in(input);
		bool rv1 = in["x"](value.x);
		bool rv2 = in["y"](value.y);
		bool rv3 = in["z"](value.z);
		bool rv4 = in["w"](value.w);
		return rv1 && rv2 && rv3 && rv4;
	} 

上面的代码演示了如何使用zenXML进行XML文件的读写和自定义类型一些处理,希望能对大家有所帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念
xml文件介绍及使用
xml编程(一)-xml语法
XML文件结构和基本语法
第2章 包装类
XML入门的常见问题(二)
Java对象的强、软、弱和虚引用
JS解析XML文件和XML字符串详解
java中枚举的详细使用介绍
了解Xml格式
XML入门的常见问题(四)
深入SQLite多线程的使用总结详解
PlayFramework完整实现一个APP(一)
XML和YAML的使用方法
XML轻松学习总节篇