扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
文档基本元素是整个文档对象模型的最基础的对象(就像Object类型是.NET对象集团的基础一样),它定义了文档元素的通用接口,一般定义为抽象类,类型名称可以为DesignElement 。
文档对象是文档对象模型的顶级对象,它包含了整个文档的内容,其类型名称可以为 DesignDocument 。
各种类型的文档元素,它是派生自文档基本元素类型,用于描述文档中各种实际存在的元素。其中可以定义一种文档元素,它们可以容纳其他的文档元素,这些元素就是容器元素。实际上文档对象就是最大的容器元素。由于文档对象模型中存在容器元素,因此所有的对象都组成一个树状结构,称为文档对象树,其中根节点就是文档对象。各种文档元素是文档对象模型的活跃分子,扩展文档对象模型大部分工作就是扩展这些文档元素,扩展文档元素需要扩展它们的两个功能,一个是文档的加载和保存,一个就是文档本身保存的数据。
文档对象模型可以和用户界面相关,也可以不相关,例如XML文档对象模型是无用户界面的。设计器的文档对象模型是和用户界面相关的,对此,扩展设计文档对象模型的文档元素时还需要扩展它们的绘制图形的能力以便设计器能绘制新型的文档元素图形。
对于设计文档对象模型,其文档基础元素可以定义的内容有三个方面,文档的加载和保存,用户界面相关的接口,维护文档对象树的接口。
文档的加载和保存
设计文档可以保存为二进制文档,纯文本文档和其他格式,在此推荐使用XML文档格式。其好处是
1.设计文档对象模型和XML文档对象模型都属于文档对象模型,两者原理和结构上都有着很大的相似性,设计文档元素和XML文档元素可以存在一一对应的关系。因此使用XML文档加载和保存设计文档对象是很自然的,实现起来比较简单。
2.XML文档是国际标准的文档格式,非常开方,其他应用程序很容易利用设计器生成的文件,简化了设计器和其他应用系统的数据接口。
3.已经存在标准的XML文档解析器和XML文档对象模型,因此不需自己处理XML文档,只需调用标准库加载XML文档对象模型,然后按照一一对应的关系来生成设计文档对象模型。
4.使用XML文档有利于保持设计器的各个版本间的兼容性。只要XML文档结构不发生大变化,低版本的设计器可以加载高版本的设计器生成的文档,同样高版本的设计器也很容易加载低版本的设计器生成的文档。若使用二进制文件格式,则设计器需要编写对于不同版本的设计文档的预处理器,比较麻烦而且很难做到向上兼容。
在保存对象数据到XML文档时,保存方式有两种,保存到XML属性和保存到XML元素。当指定某个XML元素用于保存对象数据时,若使用保存到XML属性时,会对对象每一个属性,将其数据保存到指定名称的XML属性中,而保存到XML元素时,会在当前的XML节点下新增一个指定名称的XML子元素。然后将属性值保存到XML子元素中。这两种方式生成的XML片断为:
和
value1
value2
面对这两种方式,我建议选择第二种,其原因有:
1.若保存到XML属性,则当对象属性比较多是,使用缩进方式输出的XML文档将比较宽,在查看是会出现横向滚动条,不利于阅读。而保存到XML元素时,XML文档不会很宽,便于阅读。
2.若多行文本保存到XML属性,则一般不会以多行文本的方式保存,不利于阅读。而保存到XML元素时,则保存的文本和实际的文本比较接近,便于阅读。
3.若保存到XML属性,则保存方式只能是一个属性字符串,而保存到XML元素时则保存的方式很容易进行扩展。
4.虽然保存到XML属性方式生成的XML文档比保存为XML元素的方式要小,但XML文档格式的设计目标是方便保存数据和交换数据,而不在乎文档是否冗余,因此我们选择保存方式时不必在乎XML文档的大小。而且一般设计文档的内容不很多,以目前计算机硬件条件无须在意XML文档大小。
当设计器从XML文档加载设计文档时, 首先生成XML文档对象树, 然后根据一一对应的关系来生成设计文档对象树,此时需要从XML元素保存的信息来判断该XML元素是对应于那种设计文档元素,设计器可以从XML元素名称来判断,也可以从某个XML属性来判断,在此我使用XML元素名称来判断,首先是针对一个XML元素,获得其名称比获得某个属性值要方便,其次是XML名称是必然存在的,肯定不为空,而XML属性则可能由于某种原因而缺失,XML名称比XML属性要稳定。
基于上述的认识,当采用XML文档作为保存方式时,设计基础元素需要定义两个虚函数,一个用于从XML文档加载对象属性数据,另一个要向XML文档保存对象数据。而其他文档元素对象则根据需要重载这两个函数来实现自己的加载和保存对象属性的操作,对于容器元素,还需要保存子元素数据到XML文档和从XML文档加载子元素。当然在实际应用中还要根据需要定义一些辅助成员来帮助加载和保存XML文档。
设计器生成的XML文档一般保存为文件形式,当然可以根据需要来保存的数据库里或者上传到各种服务器中。若直接保存到数据库中,则整个应用系统中所有的设计器编辑的都是同一个文档版本,而且一旦保存便可立即应用。
用户界面相关的接口
设计器需要绘制文档视图,则需要设计文档对象模型提供支持。因此文档基本元素需要定义两类通用接口,一个是和绘制文档相关的接口,一个是处理鼠标键盘事件相关的接口。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者