您的位置:首页 > 其它

使用ZenXML处理XML文档

2014-02-13 17:53 351 查看
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文件的读写和自定义类型一些处理,希望能对大家有所帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: