元数据管理系统的研究与实现
我的新浪微博:http://weibo.com/freshairbrucewoo。
欢迎大家相互交流,共同提高技术。
元数据管理系统的研究与实现
摘 要: 元数据就是描述数据的数据,随着信息技术的快速向前发展,元数据在地理空间信息资源共享过程中起着关键的作用。元数据有自己的标准,这个标准的主要作用是介绍了元数据的组成元素和分类应用,提出了一些元数据建库的基本原则,并且给出了基于XML格式的元数据管理的设计方案。本文主要是研究元数据的管理和标准,并根据此标准实现了元数据的建库、编辑、导入导出、查询和目录关联管理的功能。
关键词:元数据; 标准; XML
目录
1.概述... 2
2.元数据的标准... 2
3.建立元数据库... 3
4.系统体系结构设计... 4
5.关键技术与现实方案... 5
5.1Tree控件与XML相互转化... 5
5.2 Oracle与XML相互转化... 7
6.总结... 8
参考文献:... 8
1.概述
随着信息技术的快速发展,空间数据也在不断的增多,并且变得非常复杂,对空间数据的管理变得更加的重要和困难。因为人们需要对所使用的空间数据进行分析和做不同的处理,例如查询、计算和查看等等。但是面对网络中分布的海里空间数据,我们应该怎样查询这些数据,我们又该如何很好的利用这些数据,这些数据本身的意义可能不是那么明显。解决这些问题已经非常的急迫和重要,不然大量的空间数据信息就不能派上用场,或者是浪费大量的时间来管理和查询这些空间数据。
元数据就是为了描述数据信息而诞生的,元数据通常来讲就是描述“数据”的数据。由于空间数据复杂,用元数据来描述空间数据,可以大大提高管理和利用空间数据的效率,让抽象的空间数据变得具体化,对于空间数据的利用也更加的准确和方便,对于空间数据的管理也更加的规范化,当然管理的手段就更加丰富。描述空间数据的数据我们称为空间元数据,元数据的应用当然不仅仅在空间数据方面,只是在空间数据应用更加的贴切。空间元数据是对空间数据进行描述的数据,它以结构化的形式描述了地理数据集的内容、质量、表示方式、空间参考、管理方式以及数据集的其他特征。它不仅可以提供对空间信息数据的搜索、导航,而且便于数据的转换、维护、理解和使用。它是实现地理空间信息共享的基础,是数字地球的重要技术支撑条件之一。建立一套空间元数据管理系统,提供对元数据的采集、管理、维护与网络发布,是元数据项目实施的当务之急。
对于元数据的管理是本文重点介绍的内容,主要的内容包括元数据的标准、元数据库的建立、从XML格式的元数据导入数据库中、从数据库中导出数据为XML格式、元数据的目录关联管理、元数据的检索以及元数据的编辑等。
2.元数据的标准
元数据由描述数据特征的元素组成。空间元数据标准一般都包括这么几个部分:表示方法的说明、构成元数据的元素分类及定义(元数据字典) 、按层次关系的元素组织(元数据模式) 、元数据扩展方法与专用标准定义。本文讨论一个具体的元数据标准,对于上面提到的几个部分都有体现。本标准规定了8个必选元数据(数据集名称、数据集出版日期、数据集摘要、数据集负责方、关键词、数据集分类、数据志说明和元数据标识)和3个可选元数据,用以描述空间数据的标识、内容、管理等信息。元数据模式有一个xsd文件所定义,主要描述了对元数据的一些约束和层次关系。
在元数据标准里面涉及到一些专业术语,为了更加清楚的理解元数据以及元数据标准,我们需要先了解一下这些术语。
元数据元素(metadata element):元数据的基本单元,用以描述空间数据的某个特性。
元数据实体 (metadata entity):一组说明空间数据相关特性的元数据元素。
数据集(dataset):可标识的数据集合。
了解了什么事元数据的标准了就需要知道怎么利用这个标准,这个标准其实就是我们建立元数据库的参考,我们必须严格按照标准的定义来建立元数据库,包括它定义的数据之间的关系和每一条数据的约束,数据之间的关系主要是指主键和外键的关系,而约束主要指的是对每一条数据的数据类型和范围的约束。
3.建立元数据库
元数据库指的就是存放元数据信息的数据库系统,可以用任何的关系数据库来建立。作为本文的一个实际项目案例,我采用的是Oracle 10g。采用Oracle数据库有一个需要解决的问题就是:Oracle建立数据库需要用专门的工具(也可以用命令,但是也很复杂),我希望的是通过程序就完全能够做到,用户可以在本系统上就能轻松的完成从建库到管理等功能。SqlServer能够通过简单的Sql语句(调用执行Sql语句的接口)就能建立,Oracle不能这么轻松的完成。为了简化程序功能,我采用一种巧妙的方法来实现:就是在已存在的Oracle数据库实例上面,用数据库的名字作为所有的表的前缀,后面就跟着具体的表名(具体表名就是这种格式:xxx_xxxxx)。这对用户来说是完全透明的,只是我们用程序在后台处理好就可以了。
在介绍元数据标准里面说道,建立元数据库必须严格按照元数据定义的标准来建立。而且元数据标准的定义是一个XML格式的文件,后缀名是.xsd,也称它为XML模式定义文件,就是约束XML文件,使XML的格式更加规范。这个元数据标准文件里面有我们建立元数据库的所有信息,包括数据库的各个表名、各个表的主键和外键、各个表的字段类型和字段名称等。
要通过元数据标准文件建立元数据库,第一步需要做的是解析这个元数据标准文件。因为xsd文件时一个标准的格式定义,所以解析它不是很困难。这里推荐两种解析方案,第一种相对来说比较简单,利用微软的一个解析xsd的工具,它会自动生成一个文件(C#的代码文件),其实它生成的就是一个数据集(这个数据集是指的C#里面的数据集,专门用于管理数据集合,可以是一张物理表,也可以是多张表,而且它可以维护数据表之间的关系)。这个方案的好处是不用写一行代码就可以拥有一个完整的数据集来解析这个标准文件,而且这个数据集在以后管理一条元数据时非常方便。第二种方案就是完全按照个人的思路,把它当成普通的XML格式文件,读入并自己分析他们之间的关系,可以专门写一个这样的解析类,同样可以达到上面一样的效果,只是程序相对来说比较复杂,而且维护元数据的时候还需要自己专门写处理类。但是它的好处也是显而易见的,就是更加灵活,怎样解析完全由自己掌控,只要自己写的解析类没有bug,这种解析方案还是很不错的。本系统采用的是第一种方案,因为这样可以节约大量的时间,当然程序稳定性也会更加好。具体怎样利用微软的那个代码生成工具可以在google上收索,而且操作也是相对简单的。
4. 系统体系结构设计
本系统包含有元数据采集系统、元数据建库和管理系统、基础数据库目录查询系统。实现本系统时,通过元数据编辑器,元数据管理工具(元数据服务配置管理工具、元数据导入导出工具、目录管理工具)、元数据服务器、元数据查询系统提供相应的功能和服务。
元数据管理详细系统结构功能图如下所示:
1)元数据编辑:负责元数据信息的采集,各种元数据的操作。
2)元数据库创建:元数据库用于存储元数据,所以就是创建存储元数据的数据库。
3)元数据转换:负责在Oracle数据库与XML格式文件相互转化。
4)元数据目录关联:负责建立目录与元数据之间的关联关系,这样就可以通过目录来查看元数据信息,也可以更好的对元数据进行分类管理。
5)元数据查询系统:实现对元数据统一查询。在元数据查询子系统中用户可以通过目录结构查询元数据,也可以通过关键词查询元数据。
6)显示元数据的详细信息:由于元数据的内容多,而且每一条元数据的格式可能不完全相同,所以单独用一个模块来展示一条元数据的详细信息。
5.关键技术与现实方案
本系统采用的C#的WinForm工程实现的,所以以下所有技术的实现都是采用的C#语言。
5.1Tree控件与XML相互转化
Tree控件就是常说的树形控件,因为它的结构很像树。Tree控件和XML格式上很相似,都有递归的思想在里面,所以它们之间可以通过程序相互转化,程序中也会用到递归的思想。具体请参考下面的代码,有详细的注释。
(1)XML向Tree转化
1 /// <summary>
2
3 /// 遍历XML并实现向tree的转化
4
5 /// </summary>
6
7 /// <param name="strXmlFilePath">XML输入路径</param>
8
9 /// <param name="advTree">树控件对象</param>
10
11 public static void XMLToTree(string strXmlFilePath, AdvTree advTree)
12
13 {
14
15 //新建XML文档对象并载入XML文件数据
16
17 XmlDocument xmlDoc = new XmlDocument();
18
19 xmlDoc.Load(strXmlFilePath);
20
21 //找到根节点
22
23 XmlNodeList xnl = xmlDoc.GetElementsByTagName("metadata");
24
25 XmlNode root = xnl[0];
26
27 //根据找到的根节点遍历整个XML文件的节点
28
29 foreach (XmlNode xn in root.ChildNodes)
30
31 {
32
33 //找到Tree对于的节点
34
35 Node n = advTree.FindNodeByName(xn.Name);
36
37 //如果有子节点就调用递归转化函数
38
39 if (n.HasChildNodes)
40
41 {
42
43 //递归转化XML文件的节点到Tree的节点
44
45 TransXMLToTree(xn.ChildNodes, advTree);
46
47 }
48
49 else
50
51 {
52
53 //如果节点的内容不为空就为Tree控件节点添加值
54
55 if (xn.InnerText != "")
56
57 {
58
59 //标记已经有值,方便以后对Tree的编辑操作
60
61 n.Tag = "yes";
62
63 n.Text += xn.InnerText;
64
65 //如果此节点有父亲节点就把对于的父亲节点也标记为有值
66
67 while (n.Parent != null)
68
69 {
70
71 Node np = n.Parent;
72
73 np.Tag = "yes";
74
75 n = n.Parent;
76
77 }
78
79 }
80
81 }
82
83 }
84
85 }
(2)Tree向XML转化
1 /// <summary>
2
3 /// 遍历treeview并实现向XML的转化
4
5 /// </summary>
6
7 /// <param name="advTree">树控件对象</param>
8
9 /// <param name="strXmlFilePath">XML输出路径</param>
10
11 public static void TreeToXML(AdvTree advTree, string strXmlFilePath)
12
13 {
14
15 XmlTextWriter xtw = new XmlTextWriter(strXmlFilePath, null);
16
17 XmlDocument xmlDoc = new XmlDocument();
18
19 //控制格式并写XML的开头
20
21 xtw.Formatting = Formatting.Indented;
22
23 xtw.WriteStartDocument(true);
24
25 xtw.WriteStartElement("metadata");
26
27 xtw.WriteStartAttribute("xsi","noNamespaceSchemaLocation", "http://www.w3.org/2001/XMLSchema-instance");
28
29 xtw.WriteEndAttribute();
30
31 xtw.WriteEndElement();
32
33 xtw.WriteEndDocument();
34
35 xtw.Close();
36
37
38
39 xmlDoc.Load(strXmlFilePath);
40
41 XmlNode xnRoot = xmlDoc.SelectSingleNode("metadata");
42
43 //递归转化每一个节点
44
45 TransTreeToXml(xmlDoc, advTree.FindNodeByName("metadata").Nodes, (XmlElement)xnRoot, strXmlFilePath);
46
47 }
5.2 Oracle与XML相互转化
XML格式的元数据是元数据的一种主要来源,把XML格式的元数据导入数据库是所有工作的前提,也是很重要的一个功能。同样把Oracle中的数据导出为XML格式有着同样的意义。下面实现这两个功能的具体代码,用到了上面提到的数据集(通过微软工具自动生成的NewDataSet数据集,管理有关一条元数据的15张表)。
(1)从Oracle中导出数据到XML文件中
1 /// <summary>
2
3 /// 导出Oracle数据库的数据到XML文件中
4
5 /// </summary>
6
7 /// <param name="strXmlPath">导出的目录</param>
8
9 /// <param name="strDatabaseName">导出的数据库名称</param>
10
11 public static void ExportXmlFromOracle(string strXmlPath, string strDatabaseName)
12
13 {
14
15 NewDataSet nds;
16
17 SqlHelper sh = new SqlHelper();
18
19 string sql = string.Empty;
20
21 sql = "select mdid from " + strDatabaseName + "_metadata";
22
23 OracleDataReader odr = sh.ReturnDataReader(sql);
24
25
26
27 while (odr.Read())
28
29 {
30
31 string strMdid = odr[0].ToString();
32
33 //根据元数据的ID得到一条元数据
34
35 nds = GetOneMetaData(strMdid, strDatabaseName);
36
37 nds.WriteXml(strXmlPath + "\\" + strMdid + ".xml");
38
39 }
40
41 }
(2)导入XML中的数据到Oracle中
1 /// <summary>
2 /// 导入XML文件的数据到Oracle数据库中
3 /// </summary>
4 /// <param name="strXmlFileName">Xml文件名称(完整的路径)</param>
5 /// <param name="strDatabaseName">导入的数据库名称</param>
6 public static void ImportXmlToOracle(string strXmlFileName, string strDatabaseName)
7 {
8 NewDataSet nds = new NewDataSet();
9 string sql = string.Empty;
10 foreach (System.Data.DataTable dt in nds.Tables)
11 {
12 sql = "select * from ";
13
14 sql += strDatabaseName + "_" + dt.TableName;
15 OracleDataAdapter oda = new OracleDataAdapter(sql, ConfigurationSettings.AppSettings["ConnectionString"]);
16
17 OracleCommandBuilder builder = new OracleCommandBuilder(oda);
18
19 oda.Fill(nds.Tables[dt.TableName]);
20
21 }
22
23 nds.ReadXml(strXmlFileName);
24
25 foreach (System.Data.DataTable dt in nds.Tables)
26 {
27 if (dt.Rows.Count > 0)
28 {
29 string strTableName = strDatabaseName + "_" + dt.TableName;
30 sql = "select * from " + strTableName;
31 DataSet ds = new DataSet();
32 OracleDataAdapter oda = new OracleDataAdapter(sql, ConfigurationSettings.AppSettings["ConnectionString"]);
33 OracleCommandBuilder builder = new OracleCommandBuilder(oda);
34 oda.Fill(ds);
35 oda.Update(dt);
36 }
37 }
38 }
6.总结
本文详解介绍了元数据的相关概念以及应用,对于元数据本身的管理是本文介绍的重点,元数据的管理同其他普通数据的管理有着相似也有特殊的地方。本文介绍的元数据管理系统能够很好很方便的管理元数据,让元数据发挥更加重要的作用。元数据的组织、存储、表达、传输、查询、管理等是元数据管理系统实现时必须考虑的一些问题。在将来的工作中,要结合信息技术领域的新进展,对元数据库机制进一步完善,并在面向网络的大型地理信息系统中发挥支柱作用。
参考文献:
[1] 中国21世纪议程管理中心. 中国地理信息元数据标准研究[ C ].北京:科学出版社, 1999.