好久没有写博客了。
今天看了一篇文章,说现在很多白领都变成了“橡皮白领”,所谓橡皮白领,来自王朔的小说《橡皮人》(我没看过,呵呵),说是对职业没有了感觉,激情和才情都枯竭了,身心疲惫,却像行尸走肉一样的不停的工作和重复。深感自己也有类似的倾向,害怕也因此坠入其中,成为一个生活和工作的机器,直到有一天,变成了烂肉一堆,毫无用处。
于是,写点博客吧,每天让自己的脑子转一下,多和外界有些沟通,才不至于陷入这种困境中。
长话短说,说点xml吧。
最近再开发mstudio,需要一种更好的界面表示方法,我先后考虑过lua,也考虑过xml。从现有的情况看,还使用xml来描述界面。
xml存在的问题主要是解析困难,所以,希望找到xml针对C++的对象绑定,发现xsd可以。
xml文件除了可以用DTD解释外,还可以使用xml schema来解释。xml schema实际上描述了和xml对应的对象模型。xsd就是把xml schema转换为c++类的工具。不过xml使用了一个xml库,有18M之多,后来我找到了xsd/e,及xsd embbeded版本,这个版本很小。可以实现同样的功能。
不过,我还是不想用,因为xsde生成的C++对象,内容很庞杂,生成的文件也很多,和我在guibuilder中使用的libxml没有关系,修改的代码量不少。
另外不喜欢它的风格。
我想,既然xml schema可以简单的描述一个对象,那么我们也可以,为何要很复杂的使用xsd/e呢?
其实,作起来也不是很负责,xml schema定义了几种基本类型,如整数、字符串、枚举型、日期/时间等。每种类型都可以加限制,如整数可以限制为正整数,或者限制其范围;字符串则可以限制长度、正则表达式限制其格式等。
在基本类型上可以创建合成类型,如数组、序列(按照特定节点顺序排列)等
如果我们把每种基本类型对应一个类,如整数类、字符串类等,这些类可以增加限制。用这些信息,去描述一个xml中的节点数据应该如何被解析,如何被判断,然后我再把类的实例对应到一个结构或者类的成员上,或者绑定到成员函数上,那么,就可以完成简单的解析了。
例如,一个窗口描述的xml,它有属性caption,x, y, with,和height,要绑定到一个窗口模板上,如
struct {
string caption;
int x;
int y;
int width;
int height;
}WindowTemplate;
对应的window node有caption, x, y, width和height的属性,则绑定起来,类似这样:
{WindowTemplate::caption, StringParser("caption",256/*max length*/)},
{WindowTemplate::x, IntPairser("x", 0, 0x7FFFFF/*min & max*/)},
....
上面的语法算是伪代码,C和C++的代码写起这种规则来,会比较麻烦,可以自己写些简单的语法,转成对应的C/C++代码。
这样,就可以加入对函数的调用了。
如果能够写这种代码和C/C++混合代码的话,则可以实现更强大的功能。不过,我好像没有时间作这么多了。先写道这里吧