目录树的XML文档的自动生成
1 背景
目錄树从根到各级子目录项是一种有级别差隶属关系的分支层次结构[1],有关文件管理和调用的许多应用都涉及目录树的查找和遍历。在实际的应用程序开发过程中,经常会遇到如何查找某一文件以确定此文件的路径问题,也会将通过目录树查找资源,如:图片、文本等。
微软提供了使用TreeView控件把数据按照树形结构组织并显示出来,很直观的描述复杂的层次关系[2]。但是使用此控件描述出来的层次关系很难将其保存出来,每次都要运行程序依次获取信息信息。为了提高程序的运行效率,需要将将目录树的信息存储起来,方便在程序中必然要去获取和使用这些信息。有人试着使用数据库存储此部分信息[3],但是据库存储不能够跨平台而且用户在使用的时候需要安装庞大的数据库软件和做一些比较繁琐的配置,为大多数对数据库不熟的用户带了不便。
Xml是可扩展标记语言[4],可以用它来描述事物的信息,且能够完成的描述为树形结构。同时,Xml文档是跨平台,并且使用不需要用户安装任何的软件和配置任何的参数,通过XmlDocument类能够直接对内部信息进行操作。本文提出了一种目录树的XML文档的自动生成方法。将可以自动将文件目录树中的相关数据转换成XML 数据文档,转化出来的XML文档能够详细对文件信息进行描述方便在不同平台下对数据进行处理。避免了手工编辑生成XML 数据文档不能适应快速大量的数据交换要求。
2 文件目录树
Windows通过目录树的形式对文件和文件夹进行管理,如图1所示。
结构清晰,便于理解和读取。采用树形目录结构有如下优点:1)解决了重名问题,允许不同的用户用相同的名字去命名文件;2)有利于文件的分类,可以把不同类型的文件登录在不同的子目录下,便于查找和管理;3)能提高搜索文件的速度,可以从当前目录开始设置路径(称相对路径),从而缩短搜索路径,提高搜索速度;4)可防止用户共享文件时破坏文件,对各级目录或文件规定存取权限,凡能得到某级目录权限的用户就可得到该级目录以及所属的子目录和文件,按规定的存取权限去使用目录和文件,达到保护文件的目的。
XML是一种可扩展标记语言 (Extensible Markup Language,),用于标记电子文件使其具有结构性的标记语言,可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。XML 提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。并且在各种环境下都能够提供了对XML操作的接口或类,如C#中提供XMLDocument操作xml文档,C++中提供了---操作XML文档,Java提供------操作XML文档等。
3 基于C#的目录树的Xml描述文档的自动生成
3.1 文档的生成原理
对要生成xml文档的目录进行设定,设定完成后此目录将是XML文档的根节点。接着依次找当前目录下的每一个实体(文件或是子目录),生成上一级目录节点对应的子节点;如果当前目录中包含子目录,则递归调用节点生成函数将其设定为上一级目录节点对应的子节点,指导目录将不包含子目录了为止。这样多个子节点生成函数,反复进行递归调用,就可以实现对整个目录树的XML序列化。
3.2 具体实现
1)设置配置文件
Config文件能够将命令行选项和配置文件选项统一到一种数据结构中。通过使用Config文件,能够在外部设置项目中所用参数,而无须修改代码去设置相關的数据,实现了配置选项和代码分离。在本项目中,设置如图2所示的Config文件,在此文件中完成了对要序列化的目录树、所生成的xml文件名、所保存的路径等相关信息进行了设置。
2)定义xml节点信息
为了能够将目录和子目录的详细标注在xml文件中,定了xml节点的描述信息,通过类XmlNode来显示,具体代码如图3所示。
3)xml文件的自动生成
根据所输入要生成的序列化的目录,写一个递归遍历方法完成序列化过程,并将序列化的结果写入到xml文件中,算法的具体实现过程描述如下:
输入:要序列化的目录
输出:根据目录生成的xml文件
Step1:初始化相关信息(xml文件的保存路径、名字;要被序列化的目录的名字、路径等);
Step2:判断xml文件保存的路径是否存在,如果存在则进行step3,否则跳转step4;
Step3:则将原有的删除,重新按照初始化信息生成保存路径;
Step4:按照初始化信息直接生成保存路径;
Step5:判断要保存的xml文件路径和要序列化的目录树是否为空,如果为空则抛出异常,否则继续step6;
Step6:设置文件流和xml文本写入对象;
Step7:设计一个递归遍历方法完成xml信息写入;
Step7.1:选择的序列化目录路径;
Step7.2:判断要序列化目录路径是否存在,如果存在则生成一个目录对象,否则结束算法;
Step7.3:获取目录对象的相关信息,如:包含的子目录个数和文件个数;
Step7.4:生成xml文件的节点,此节点描述出目录对象的相关信息,如:目录名字和子目录数量等;
Step7.5:判断子目录是否存在,如果存在则遍历所有的子目录,对每个子目录递归Step 7.3直到当前目录中不存在子目录为止;该目录是否有子文件,有则进行Step7.6,无则进行Step8;
Step7.6:统计子文件所在目录的名字和子文件的个数,根据目录名字生成xml的一个节点名,同时为这个节点添加其子节点个数的属性。遍历这个目录的子文件集合,得到子文件的全路径,生成一个与子文件的名字相同的节点,将该文件的路径作为一个值写进去。然后判断这个目录对象是否有子目录,有则进行Step7.3,无则进行Step8;
Step8:关闭xml文件写入和文件流。
4 应用实例
根据上面的设计方案,开发了一款界面如图4所示的系统。
选择“Choose directory to use”框中的“browse”按钮,打开window的浏览窗口,选择要序列化的文件夹,例如本演示中选择的的目录:D:\xyx\语义文字。选择“Choose directory to save”框中的“browse”按钮,打开window的浏览窗口,选择要保存文件位置,本实例中选择的目录是:D:\xmlFile。在“Input filename”后面的文本框中输入所生成的xml文件的名字:myFirstXml。点击“view”按钮,则可看到在目录D:\xmlFile下面生成了一个名字为myFirstXml的xml文件,如图6所示。使用任何可以编辑xml文件的编辑器打开xml文件,会发现xml中的内容如图7所示,打开xml中的任何一个节点,能够发现文字的根据文件中的内容所标注出来的的语义信息[5],如上下结构中“吉”的语义信息如图8所示。
5 结束语
本文描述了使用C#语言在VS2013环境下将windows中目录信息使用xml文档存储的方法,展示了根据此方法做出来的系统及其应用。所生成的xml文档能够跨平台使用的而且不需要用户安装任何的软件和配置任何的参数,提高了程序的运行速度,为目录树访问的项目开发提供了方便和支持。
参考文献:
[1] 赵晓琴. 让Windows7资源管理器也显示目录树[J]. 电脑爱好者, 2012(1): 39-39.
[2] 周炎涛, 陈贤谋. 中TreeView控件与数据库结合创建动态目录树[J]. 航空计算技术, 2004, 34(2): 25-27.
[3] 李贵辉, 宋秀云. 基于WEB的动态目录树创建与应用[J]. 电脑知识与技术: 学术交流, 2006(1): 71-72.
[4] 田中雨, 郭磊. XML实践教程[M]. 北京: 清华大学出版社, 2016.
[5] 凌海云, 左志宏, 陈兰, 等. 语义标注元数据及其抽取技术[J]. 计算机应用研究, 2004, 21(7): 147-149.
上一篇:基于S7—1200PLC和力控组态软件的井式炉控制系统设计
下一篇:温泉酒店客人定位管理系统