以XML文件存储配置数据的技术实现,c++
一般新手通常只是使用类似的Xerces,
TinyXML之类的XML解析xml,这种方式实际上很浪费时间,自己编写很多代码也容易出错。因为,他们经常要写一个XML对象Entity的类,并附着一堆对象解析的code。工作量比较大。使用XML
Schema工具,XSD设计工具,然后通过工具生成EntityClass和Paser
class。我不知道这种技术确切的起源时间,但是我知道这种用法用法已经被使用有7、8年了吧。以前写程序,用INI保存配置数据,数据类型还要自己定义,当然也要写一堆的code去解析。
这里推荐的思路是:设计XML
Schema,然后使用工具自动生成代码,编写简单的接口供上层App调用。虽然这种XML保存配置数据的方式保密性不好,但是我们假设有一天XML
schema可以直接转换成某一种数据库schema,将配置数据保存到数据库中并依赖数据加密机制保证数据的安全性。这是后话,暂且放放吧。
设计XML Schema的工具有:MS XML tool, XSD from http://wiki.codesynthesis.com/Using_XSD_with_Microsoft_Visual_Studio
,
还有很多商业工具,如XMLSpy, Oxygen XML Editor.
codesynthesis
XSD 是一个开源的工具,来自Berkeley,
从编译选项看,支持wchar *,
但是通过实践和测试,不能很好得读取包含非ASCII码的文件。如果让应用程序支持_unicode选项的话,会有compiling error.来自 XSD
lib的 print函数。匪夷所思。可能人家不需要读取别国文字吧。
XMLspy 2009 功能很强大,可以设计XML schema, 可以转换DB Schema=> XML Schema,
可以帮你生成一个XML文件,可以根据 XML Schema生成 Java/C++/C# 代码,包括Entity Class,
存取机制甚至测试代码。有一点比较值得称赞就是:在生成代码的前,它让你选择选择XML access library, 如MS XML,or
Xerces。如图:
如果选择 Xerces, 默认情况下,产生的代码是Xerces_2
系列的。如果你使用的是Xerces_3系列的话,对不起有编译错误,因为Interface 在从Xerces2到升级的时候被改写了。
当然,XMLSpy生成的代码也是支持跨平台的,只需要添加一些make
file即可。XMLSpy生成的代码也是支持非ASCII文字的,在编译前填加_MBCS到project
setting中,并将你的XMLfile保存成UTF-8格式。注意我们这里根本就没有提起_unicode或者Unicode.
我这里不说具体原因了。自己体会吧。
Oxygen XML Editor
我这里为什么会提起他呢?主要原因是,我想将一些存储在数据库的表及数据convert到XML中。我使用的是PostgreSQL
相关文档:
如何在VC环境下编写程序读取XML文件?清提供源代码.谢谢.
#import <msxml3.dll> named_guids //导入动态库,装了IE5就有
using namespace MSXML2; //引用命名空间,一般可以把命名空间理解成类和接口的集合,呵呵,对不对我也不知道了
#include <vector>
using na ......
/*
* 主要作用;
* 从xml读取游戏配置信息或保存
*/
using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Forms;
using System.IO;
using System.Xml;
using System.Reflection;
namespace Game
{
class Config
{
Ke ......
#include "iostream.h"
#include "stdio.h"
#import "C:\program files\common files\system\ado\msado15.dll" no_namespace rename("EOF","adoEOF")
int main(int argc, char* argv[])
{
::CoInitialize(NULL);
_ConnectionPtr m_pConnection;
m_pConnection.CreateInstance("ADODB.Connection");
tr ......
//判断该xml文档是否存在,不存在则创建
if (!File.Exists(Constants.SYS_CONFIGURE_URL + @"\SaveAccount.xml"))
&nbs ......
上篇文章说到linux需要itoa函数,下面我就提供一份跨平台的itoa函数。
//return the length of result string. support only 10 radix for easy use and better performance
int my_itoa(int val, char* buf)
{
const int radix = 10;
char* p;
int a;&nbs ......