CN1622095A - 可扩展标记语言文件存储及插入关系数据库表的方法 - Google Patents
可扩展标记语言文件存储及插入关系数据库表的方法 Download PDFInfo
- Publication number
- CN1622095A CN1622095A CN 200410102754 CN200410102754A CN1622095A CN 1622095 A CN1622095 A CN 1622095A CN 200410102754 CN200410102754 CN 200410102754 CN 200410102754 A CN200410102754 A CN 200410102754A CN 1622095 A CN1622095 A CN 1622095A
- Authority
- CN
- China
- Prior art keywords
- markup language
- name
- node
- extensible markup
- type
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Document Processing Apparatus (AREA)
Abstract
本发明公开了一种可扩展标记语言文件存储方法,包括步骤将模式间的依赖关系存放在关系数据库系统表中;为可扩展标记语言文件中的每一个名称空间创建一个映射文件;为映射文件中每一个复杂类型、全局元素以及出现不止一次的简单类型元素分别生成一个与其对应的关系数据库表;将可扩展标记语言文件的元素值及其属性值插入与其对应的数据库表中。一种可扩展标记语言文件元素值插入关系数据库表的方法包括步骤获取可扩展标记语言文件所属的可扩展标记语言文件模式;根据模式所定义的名称空间从数据库中读出可扩展标记语言文件的数据库映射文件;遍历可扩展标记语言文件,将可扩展标记语言文件元素值插入相应的关系数据库表中。占用存储空间小且高效查询。
Description
技术领域
本发明涉及可扩展标记语言领域,尤指一种可扩展标记语言文件存储及插入关系数据库表的方法。
背景技术
随着Internet的迅猛发展,xml(Extensible Markup Language,可扩展标记语言)作为Internet上数据表示的新标准,以其具有的自描述性、灵活性、扩展性和平台无关性等优势,正在被广泛的应用于各种Web应用中。
如何对xml文件进行存储,才能有效地对其数据进行管理成为当今研究的热点。近年来许多研究工作致力于将数据库技术应用于xml文件的存储上,利用数据库成熟的技术来存储xml文件。目前主流的xml数据库形式是利用关系数据库来存储xml文件,例如Oracle9i、SQL Server 2000等关系数据库。
当前用关系型数据库存储xml文件最常见的有两种方法:一种就是将xmlSchema(xml模式)映射到关系数据库模式;另一种方法就是将整个文件保存为一个CLOB(character large obiect,字符大对象)字段。两种方法各有优劣,采用前一种方法,xml Schema被映射为数据库中多个相互关联的表存储xml文件后对其进行查询时将导致多表连接,使得查询效率很低,并且在重组xml层次结构时不仅效率较低而且很难恢复原样,没有很好的“往返”性(存储的xml文档和返回的xml文档的一致性)。采用后一种方法存储xml文件,由于xml文件中使用了大量的标签,大量的标签会占用很多存储空间,因而采用该方法会浪费大量的存储空间,据统计,平均在40%左右,同时该方法虽然保存了xml文件的数据内容和层次结构,但SQL查询不能深入到文件的字段,查询文件部分的唯一方法是将整个文件返回,解析之后查询,不适合于文件较大或者多文件查询的情况。
发明内容
本发明要解决的问题是提供一种占用存储空间小而且能够高效查询的可扩展标记语言文件存储方法。
为了解决上述问题,本发明可扩展标记语言文件存储方法的技术方案包括下述步骤:
10)将模式间的依赖关系存放在关系数据库系统表中;
20)为可扩展标记语言文件中的每一个名称空间创建一个映射文件,所述映射文件包括该模式中所有的复杂类型、简单类型、全局元素以及相应子元素;
30)为映射文件中每一个复杂类型、全局元素以及出现不止一次的简单类型元素分别生成一个与其对应的关系数据库表,其所包含子元素和出现小于等于一次的简单类型作为与其对应的关系数据库表中的字段;
40)将可扩展标记语言文件的元素值及其属性值插入与其对应的数据库表中。
所述步骤20)进一步细分为下述步骤:
200)获取可扩展标记语言文件的模式对象模型;
201)根据模式对象模型获取每一个模式所对应的名称空间并为每一个名称空间创建一个映射文件;
重复步骤202)至208)填充每一个映射文件,
202)获取每个名称空间的全部全局元素和复杂类型;
203)为每一个全局元素生成一个可扩展标记语言元素映射节点,并设置与其相应的属性;
204)生成可扩展标记语言元素映射集合节点,且该集合节点包含步骤203)中生成的所有节点;
205)为每一个复杂类型生成一个可扩展标记语言类型节点,并设置与其相应的属性;
206)找出每一个复杂类型所包含的所有子元素;
207)为每一个子元素生成一个可扩展标记语言元素节点并将其放入其所属的复杂类型的扩展标记语言类型节点中;
208)生成可扩展标记语言类型集合节点,该集合节点包括步骤205)中生成的所有可扩展标记语言类型节点。
所述步骤30)进一步细分为下述步骤:
300)为映射文件中的每一个可扩展标记语言类型节点生成一个关系数据库表,表名为其属性复杂类型标识;
301)将每一个可扩展标记语言类型节点所包含的所有属性和出现小于等于一次的简单类型元素作为与其相应的关系数据库表的字段;
302)为每一个出现不止一次的简单类型元素生成一个子关系数据库表,该表名为其属性元素标识;
303)为每一个关系数据库表建立公共字段。
本发明可扩展标记语言文件存储方法还包括步骤建立数据库系统表,所述数据库系统表包括:
模式引用关系表,用于存放可扩展标记语言文件模式间的依赖关系;
模式表,用于存放可扩展标记语言文件模式与其对应的映射文件的对应关系;
文件实例表,用于存放可扩展标记语言文件存储标识。
所述步骤40)又进一步分为下述步骤:
400)解析可扩展标记语言文件以获得文档对象模型;
对所述文档对象模型中的每一个节点,执行步骤401)至步骤404):
401)通过映射文件得到该节点的属性:元素类别和类型;
402)若元素类别为简单类型,且出现次数小于等于一次,将该节点值插入其父节点对应的关系数据库表中;
403)若元素类别为简单类型,且出现至少一次,将该节点值插入其对应的关系数据库表中;
404)若元素类别为复杂类型,将该节点值插入其对应的关系数据库表中,且将该节点的属性值插入该关系数据库表中的相应字段中。
相应地,本发明可扩展标记语言文件元素值插入关系数据库表的方法的技术方案包括下述步骤:
a)获取可扩展标记语言文件所属的可扩展标记语言文件模式;
b)根据模式所定义的名称空间从数据库中读出可扩展标记语言文件的映射文件;
c)遍历可扩展标记语言文件,将可扩展标记语言文件元素值插入相应的关系数据库表中。
与现有技术相比,本发明可扩展标记语言文件存储及插入关系数据库表的方法的有益效果是:
由于采用将可扩展标记语言文件中的元素提取出来存放到关系数据库表中,并不对其标签等进行存储,故所占用的存储空间小。
另外,由于将每一个复杂类型、全局元素以及出现不止一次的简单类型元素分别生成一个与其对应的关系数据库表,不考虑该元素是由哪个xml schema所引用。这样使生成的表不依赖于引用该元素的xml schema,而只依赖于定义该元素的xml schema。因而使所有相同类型的元素一定共享相同的数据库结构。当不同来源的元素导入数据库时,它们会在这里汇集,存储在一起,成为一个个数据团,这样在查询某一元素时,只查询与其对应的表即可,而不必在考虑与其有关的xml schema,从而可实现对xml文件数据的高效查询。
附图说明
图1是本发明可扩展标记语言文件存储方法流程图;
图2是图1中步骤20)进一步划分的流程图;
图3是图1中步骤30)进一步划分的流程图;
图4是实施例中四个模式的依赖关系示意图;
图5是图1中步骤40)进一步划分的流程图;
图6是本发明可扩展标记语言文件元素值插入关系数据库表的方法流程图。
具体实施方式
如图1所示,本发明可扩展标记语言文件存储方法包括下述步骤:
10)将模式间的依赖关系存放在关系数据库系统表中;
20)为可扩展标记语言文件中的每一个名称空间创建一个映射文件,所述映射文件包括该模式中所有的复杂类型、简单类型、全局元素以及相应的子元素;
30)为映射文件中每一个复杂类型、全局元素以及出现不止一次的简单类型元素分别生成一个与其对应的关系数据库表,其所包含的子元素和出现小于等于一次的简单类型元素作为与其对应的关系数据库表中的字段。
40)将可扩展标记语言文件的元素值及其属性值插入与其对应的数据库表中。
通过为可扩展标记语言中的每一个名称空间创建一个映射文件,然后根据映射文件将可扩展标记语言中的类型(复杂类型、全局元素以及出现不止一次的简单类型)映射成关系数据库表,最后再根据xml文件元素的元素类型将xml文件元素值插入关系数据库表中,从而实现了将xml文件存储在关系数据库表中。
如图2所示,所述步骤20)进一步包括下述步骤:
200)获取可扩展标记语言文件的模式对象模型;
201)根据模式对象模型获取每一个模式所对应的名称空间并为每一个名称空间创建一个映射文件;
重复步骤202至步骤208)填充每一个映射文件
202)获取每个名称空间的所有的全局元素和复杂类型;
203)为每一个全局元素生成一个XmlMappingElement(可扩展标记语言元素)节点,并设置与其相应的属性;
204)生成XmlMappingElements(可扩展标记语言元素集合)节点,XmlMappingElements节点包含步骤203)中生成的所有XmlMappingElement节点;
205)为每一个复杂类型生成一个XmlMappingType(可扩展标记语言类型)节点,并设置与其相应的属性;
206)找出每一个复杂类型所包含的所有子元素;
207)为每一个子元素生成一个XmlMappingElement节点并将其放入其所属的复杂类型的XmlMappingType节点中;
208)生成XmlMappingTypes(可扩展标记语言类型集合)节点,XmlMappingTypes节点包括步骤205)中生成的所有XmlMappingType节点。
如表一所示,所述与XmlMappingType节点相应的属性为:
复杂类型标识,id,用于标识该复杂类型,
名称,name,用于表示该复杂类型的全局名称,
名字空间,namespace,用于表示该复杂类型的名字空间。
如表二所示,与XmlMappingElement节点相应的属性为:
名称,name,用于表示该元素的全局名称,
原始名称,localName,用于表示由模式对象模型指定的该元素的原始名称,
元素类别,elementType,用于表示该元素的类别,
元素类型,type,用于表示该元素的类型,
元素标识,id,用于标识该元素,
最小出现次数,minOccurs,用于表示在某个复杂类型中的最小出现次数,
最大出现次数,maxOccurs,用于表示在某个复杂类型中的最大出现次数。
表一
diagram | XmlMappingType…XmlMappingElement | |||
attributes | Name | Type | Use | 说明 |
id | xs:string | required | 使用UUID表示该复杂类型的唯一标识 | |
name | xs:string | required | 表示该复杂类型的全局唯一名称,主要利用名字空间来限定名称,保证它的全局唯一性 | |
namespace | xs:string | required | 表示该复杂类型的名字空间 |
表二
diagram | XmlMapping Element | |||
attributes | Name | Type | Use | 说明 |
name | xs:string | required | 表示该元素的全局唯一名称,主要利用名字空间来限定名称,保证它的全局唯一性 | |
localName | xs:string | required | 表示由schema指定的元素的原始名称(相对于全局名) | |
elementType | xs:string | required | 表示元素类别,表明它是简单元素、复杂元素还是属性,取值为Attribute,simple,或complex | |
type | xs:string | required | 表示该元素类型 |
id | xs:string | required | 使用UUID表示该元素的唯一标识 | |
minOccurs | xs:int | optional | 元素在某个复杂类型中的最小出现次数 | |
maxOccurs | xs:int | optional | 元素在某个复杂类型中出现的最大次数 |
如图3所示,所述步骤30)进一步包括下述步骤:
300)为映射文件中的每一个XmlMappingType节点生成一个关系数据库表,表名为其属性复杂类型标识(id);
301)将每一个XmlMappingType节点所包含的所有属性和出现小于等于一次的简单类型元素作为与其相应的关系数据库表的字段;
302)为每一个出现不止一次的简单类型元素生成一个子关系数据库表,该表名为其属性元素标识;
303)为每一个关系数据库表建立下列字段,
记录序号,uuid_id,用于表示记录顺序
实例元素名称,uuid_name,用于表示xml文件实例中该元素的名称
实例标识,uuid_docid,用于标识xml文件实例,
父元素标识,uuid_parentid,用于标识该元素的父元素,
元素顺序,uuid_order,用于表示xml文件实例中元素出现的顺序。
本发明可扩展标记语言类型至关系数据库表的映射方法还包括步骤建立数据库系统表,所述数据库系统表包括:
模式引用关系表,Schemacrossref,用于存放可扩展标记语言文件模式间的依赖关系,包括字段名称空间(namespace)和名称空间引用(refednamespace);
模式表,Schema,用于存放可扩展标记语言文件模式与其对应的映射文件的对应关系,包括字段名称空间(namespace)、名字(name)、模式内容(text)和映射文件名(mapping);
文档实例表,DocInstance,用于存放可扩展标记语言文件存储标识,包括字段文档实例标识(id)、名字(name)、文档集合表外键(collectionId(FK))和文档原始内容(text);
复杂类型表,complexType,用于记录数据库导入的模式所生成的数据库表(id为生成的表名),包括字段复杂类型标识(id)、名字(name)、名称空间表外键(namespace(FK))和类型(type);
全局元素表,docRoot,用于保存数据库导入的模式所定义的全局元素,包括字段全局元素标识(id)、名字(name)和名称空间(namespace(FK));
文档集合表,Collection,用于存放一类xml文件的集合,包括字段文件标识(id)、名字(name)和全局元素表外键(docrootid(FK))。
如图5所示,所述步骤40)又进一步分为下述步骤:
400)解析可扩展标记语言文件以获得文档对象模型;
对所述文档对象模型中的每一个节点,执行步骤401至步骤404):
401)通过映射文件得到该节点的属性:元素类别和类型;
402)若元素类别为简单类型,且出现次数小于等于一次,将该节点值插入其父节点对应的关系数据库表中;
403)若元素类别为简单类型,且出现至少一次,将该节点值插入其对应的关系数据库表中;
404)若元素类别为复杂类型,将该节点值插入其对应的关系数据库表中,且将该节点的属性值插入该关系数据库表中的相应字段中。
通过xml文件元素的元素类别将元素值存储在相应的关系数据库表中。
下面通过一个具体的实例来详述本发明可扩展标记语言文件存储方法的技术方案。
下面的xml文件有四个模式。
模式一:company.xsd<?xml version=″1.0″encoding=″UTF-8″?><xs:schema targetNamespace=″http://org.xmldb.company″xmlns:xs=″http://www.w3.org/2001/XMLSchema″xmlns=″http://org.xmldb.company″xmlns:per=″http://org.xmldb.personnel″elementFormDefault=″qualified″attributeFormDefault=″unqualified″>
<xs:import namespace=″http://org.xmldb.personnel″schemaLocation=″personal.xsd″/>;依赖模式personal.xsd
<xs:element name=″company″>
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name=″employee″type=″employee″/>
<xs:element name=″department″>
<xs:complexType>
<xs:sequence>
<xs:element name=″manager″>
<xs:complexType>
<xs:sequence>
<xs:element name=″rank″type=″xs:string″/>
<xs:element ref=″per:person″/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name=″name″type=″xs:string″/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:complexType name=″employee″>
<xs:sequence>
<xs:element ref=″per:person″maxOccurs=″unbounded″/>
</xs:sequence>
</xs:complexType></xs:schema>
模式二:government.xsd<?xml version=″1.0″encoding=″UTF-8″?><xs:schema targetNamespace=″http://org.xmldb.government″xmlns:xs=″http://www.w3.org/2001/XMLSchema″xmlns:per=″http://org.xmldb.personnel″xmlns=″http://org.xmldb.government″elementFormDefault=″qualified″attributeFormDefault=″unqualified″>
<xs:import namespace=″http://org.xmldb.personnel″schemaLocation=″personal.xsd″/>;依赖模式personal.xsd
<xs:element name=″govemment″>
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name=″officers″>
<xs:complexType>
<xs:sequence>
<xs:element ref=″per:person″maxOccurs=″unbounded″/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name=″name″type=″xs:string″/>
<xs:element name=″affiliated″type=″xs:string″/>
</xs:sequence>
</xs:complexType>
</xs:element></xs:schema>
模式三:personal.xsd<?xml version=″1.0″encoding=″UTF-8″?><xs:schema targetNamespace=″http:″org.xmldb.personnel″xmlns:xs=″http://www.w3.org/2001/XMLSchema″xmlns=″http://orgxmldb.personnel″xmlns:addr=″http://org.xmldb.address″elementFormDefault=″qualified″>
<xs:import namespace=″http://org.xmldb.address″schemaLocation=″address.xsd″/>;依赖模式address.xsd
<xs:element name=″personnel″>;模式定义的全局元素
<xs:complexType>;模式定义的复杂类型
<xs:sequence>
<xs:element rer=″person″maxOccurs=″unbounded″/>
</xs:sequence>
</xs:complexType>
<xs:unique name=″uniquel″>
<xs:selector xpath=″person″/>
<xs:field xpath=″name/given″/>
<xs:field xpath=″name/family″/>
</xs:unique>
<xs:key name=″empid″>
<xs:selector xpath=″person″/>
<xs:field xpath=″@id″/>
</xs:key>
<xs:keyref name=″keyrefl″refer=″empid″>
<xs:selector xpath=″person″/>
<xs:field xpath=″link/@manager″/>
</xs:keyre>
</xs:element>
<xs:element name=″person″>;模式定义的全局元素
<xs:complexType>;模式定义的复杂类型
<xs:sequence>
<xs:element ref=″name″/>
<xs:element ref=″email″minOccurs=″0″maxOccurs=″unbounded″/>;Schema定义的重复多
<xs:element ref=″url″minOccurs=″0″maxOccurs=″unbounded″/>次的简单类型元素
<xs:element name=″addresses″>
<xs:complexType>;模式定义的复杂类型
<xs:sequence maxOccurs=″unbounded″>
<xs:element ref=″addr:address″/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name=″id″type=″xs:ID″use=″required″/>
<xs:attribute name=″note″type=″xs:string″/>
<xs:attribute name=″contr″default=″false″>
<xs:simpleType>
<xs:restriction base=″xs:string″>
<xs:enumeration value=″true″/>
<xs:enumeration value=″false″/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
<xs:attribute name=″salary″type=″xs:integer″/>
</xs:complexType>
</xs:element>
<xs:element name=″name″>;模式定义的全局元素
<xs:complexType>;模式定义的复杂类型
<xs:all>
<xs:element ref=″family″/>
<xs:element ref=″given″/>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name=″family″type=″xs:string″/>;模式定义的全局元素
<xs:element name=″given″type=″xs:string″/>;模式定义的全局元素
<xs:element name=″email″type=″xs:string″/>;模式定义的全局元素
<xs:element name=″url″>;模式定义的全局元素
<xs:complexType>;模式定义的复杂类型
<xs:attribute name=″href″type=″xs:string″default=″http://″/>
</xs:complexType>
</xs:element></xs:schema>
模式四:address.xsd<?xml version=″1.0″encoding=″UTF-8″?><xs:schema targetNamespace=″http://org.xmldb.address″xmlns:xs=″http://www.w3.org/2001/XMLSchema″xmlns=″http://org.xmldb.address″elementFormDefault=″qualified″attributeFormDefault=″unqualified″>
<xs:element name=″address″>
<xs:annotation>
<xs:documentation>Comment describing your root element</xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element name=″tel″type=″xs:string″/>
<xs:element name=″postcode″type=″xs:string″/>
<xs:element name=″street″type=″xs:string″/>
</xs:sequence>
</xs:complexType>
</xs:element></xs:schema>
首先,建立数据库系统表docInstance、collection、complexType、schema、schemacrossref和docRoot。
然后,使用通用的解析器将schema作为普通的xml文件进行解析,分析其中的xs:import元素,将xml schema间的依赖(import)关系存入数据库系统表Schemacrossref中。在导入某个具体的模式时,由于其可能依赖其它的模式,如果这些依赖的模式没有导入到schemacrossref中,则将其一并导入。
如图4所示,上述四个模式的依赖关系为company.xsd和government.xsd均依赖personal.xsd,personal.xsd依赖address.xsd。
导入government.xsd后表Schemacrossref的存储结果为:
Namespace | Refednamespace |
http://org.xmldb.personnel | http://org.xmldb.address |
http://org.xmldb.government | http://org.xmldb.personnel |
然后导入company.xsd后表Schemacrossref的存储结果为:
Namespace | Refednamespace |
ht tp://org.xmldb.personnel | http://org.xmldb.address |
http://org.xmldb.government | http://org.xmldb.personnel |
http://org.xmldb.company | http://org.xmldb.personnel |
下面本例采用schema解析器,例如:apach xerces,获取符合w3c规范的schema对象模型,再根据schema对象模型获取其所引用的名称空间,本例中company.xsd所获得的schema对象所引用的名称空间有三个,分别是:
http://org.xmldb.company
http://org.xmldb.personnel
http://org.xmldb.address
再为每一个名称空间创建一个映射文件,分别是mapping-company.xml、mapping-personal.xml和mapping-address.xml。本例将模式与映射文件的对应关系存放在数据库系统表schema中,存储后表schema结果为:
NAMESPACE | NAME | TEXT | MAPPING |
http://org.xmldb.company | company.xsd | 内容略,为Schema原始文本 | 内容略,为mapping原始文本 |
http://org.xmldb.personnel | personal.xsd | 同上 | 同上 |
http://org.xmldb.address | address.xsd | 同上 | 同上 |
下面描述模式三:personal.xsd生成映射文件mapping-personal.xml的过程。
在该过程之前先采用下述方法对personal.xsd中的类型和元素进行命名:
将全局元素命名为“{element}{+目标名称空间+}+元素的名称属性值”;
将全局复杂类型命名为“{type}{+目标名称空间+}+复杂类型的名称属性值”;
将局部元素命名为“包含该局部元素的复杂类型的全局名字+“/”+该局部元素的名称属性值”;
将局部复杂类型命名为该局部复杂类型的父元素的全局名字;
将简单类型命名为其基础类型的全局名字。
故该模式定义的所有全局元素及其全局名字如下:
personnel:{element}{http://org.xmldb.personnel}personel
person:{element}{http://org.xmldb.personnel}person
name:{element}{http://org.xmldb.personnel}name
family:{element}{http://org.xmldb.personnel}family
given:{element}{http://org.xmldb.personnel}given
email:{element}{http://org.xmldb.personnel}email
url:{element}{http://org.xmldb.personnel}url
五个复杂类型的全局名字为:
{element}{http://org.xmldb.personnel}personel
{element}{http://org.xmldb.personnel}person
{element}{http://org.xmldb.personnel}name
{element}{http://org.xmldb.personnel}url
{element}{http://org.xmldb.personnel}person/addresses
局部简单类型的全局名字为:
{type}{http://www.w3.org/2001/XMLSchema}String
该模式的元素和类型有了全局名字后,即能够区分不同的类型和元素,映射文件mapping-personal.xml的获取过程如下:
获取personal.xsd中的全部全局元素和复杂类型。
所获得的全局元素为:personnel,person,name,family,given,email,url
所获得的复杂类型为:
{element}{http://org.xmldb.personnel}personnel
{element}{http://org.xmldb.personnel}person
{element}{http://org.xmldb.personnel}name
{element}{http://org.xmldb.personnel}url
{element}{http://org.xmldb.personnel}person/addresses
然后对每一个全局元素生成一个XmlMappingElement节点并设置其相应的属性。再生成XmlMappingElements节点,该节点包含所有生成的XmlMappingElement节点。本例为:;xml元素集合节点<XmlMappingElements>;全局元素person
<XmlMappingElement
name=″{element}{http://org.xmldb.personnel}person″localName=″person″
elementType=″complex″
type=″{element}{http://org.xmldb.personnel}person″
id=″F8522164_DC8A_498E_88E_D7ACF6291D39″/>;全局元素personnel
<XmlMappingElement
name=″{element}{http://org.xmldb.personnel}personnel″
localName=″personnel″elementType=″complex″
type=″{element}{http://org.xmldb.personnel}personnel″
id=″DB1D8AEA_A320_4203_BC3F_B2FE7D4AE326″/>;全局元素url
<XmlMappingElement
name=″{element}{http://org.xmldb.personnel}url″localName=″url″
elementType=″complex″type=″{element}{http://org.xmldb.personnel}url″
id=″2E1E9830_AB88_4DC8_8B72_A3DE735CA329″/>;全局元素family
<XmlMappingElement
name=″{element}{http://org.xmldb.personnel}family″localName=″family″
elementType=″simple″
type=″{type}{http://www.w3.org/2001/XMLSchema}string″
id=″3DC9DBB9_9E7E_4CF4_BDA8_A0AF486E5364″/>;全局元素name
<XmlMappingElement
name=″{element}{http://org.xmldb.personnel}name″localName=″name″
elementType=″complex″
type=″{element}{http://org.xmldb.personnel}name″
id=″5F8ECF2E_82E5_48E7_BD5D_C21FAC8CC297″/>;全局元素given
<XmlMappingElement
name=″{element}{http://org.xmldb.personnel}given″localName=″given″
elementType=″simple″
type=″{type}{http://www.w3.org/2001/XMLSchema}string″
id=″11B6ACF7_CC08_415C_8650_FB5730BE0137″/>;全局元素email
<XmlMappingElement
name=″{element}{http://org.xmldb.personnel}email″localName=″email″
elementType=″simple″
type=″{type}{http://www.w3.org/2001/XMLSchema}string″
id=″CAAAF143_2956_454D_8AF3_8E59F56BBA4E″/>
</XmlMappingElements>
最后将每一个复杂类型生成XmlMappingType节点并设置相应属性,还要找出每一个复杂类型所包含的所有子元素(包括属性)。对每一个子元素生成XmlMappingElement节点,并将其放入其所属的复杂类型的XmlMappingType节点中。再生成XmlMappingTypes节点,该节点包含所有生成的XmlMappingType节点。
Personal.xsd生成的映射文件中XmlMappingTypes和XmlMappingType为:;xml类型集合节点<XmlMappingTypes>;复杂类型{element}{http://org.xmldb.personnel}personnel
<XmlMappingType id=″94737D4C_F969_48FF_A4A1_823FA8647BAD″
name=″{element}{http://org.xmldb.personnel}personnel″
namespace=″http://org.xmldb.personnel″>;子元素person
<XmlMappingElement
name=″{element}{http://org.xmldb.personnel}person″
localName=″person″elementType=″complex″
type=″{element}{http://org.xmldb.personnel}person″
id=″F8522164_DC8A_498E_888E_D7ACF6291D39″/>
</XmlMappingType>;复杂类型{element}{http://org.xmldb.personnel}person
<XmlMappingType id=″D62E1F94_35CA_4362_BB4E_DC39C58EACA3″
name=″{element}{http://org.xmldb.personnel}person″
namespace=″http://org.xmldb.personnel″>;子元素id
<XmlMappingElement name=″id″ localName=″id″
elementType=″attribute″
type=″{trpe}{http://www.w3.org/2001/XMLSchema}ID″
id=″81195F3E_ED21_44C6_A0D5_F4F0E44BC159″/>;子元素note
<XmlMappingElement name=″note″localName=″note″
elementType=″attribute″
type=″{type}{http://www.w3.org/2001/XMLSchema}string″
id=″7AA4C149_DB7A_4F75_91DF_B01EF4B5B40D″/>;子元素Contr
<XmlMappingElement name=″contr″localName=″contr″
elementType=″attribute″
type=″{trpe}{http://www.w3.org/2001/XMLSchema}string″
id=″11C9845E_B1BF_4BFC_A1D0_CD6D8gF50F41″/>;子元素salary
<XmlMappingElement name=″salary″localName=″salary″
elementType=″attribute″
type=″{trype}{http://www.w3.org/2001/XMLSchema}integer″
id=″34009506_9DC1_4468_A654_E66BFFE49FCD″/>;子元素name
<XmlMappingElement
name=″{element}{http://org.xmldb.personnel}name″localName=″name″
elementType=″complex″
type=″{element}{http://org.xmldb.personnel}name″
id=″5F8ECF2E_82E5_48E7_BD5D_C21FAC8CC297″/>;子元素email
<XmlMappingElement
name=″{element}{http://org.xmldb.personnel}email″localName=″email″
elementType=″simple″
type=″{type}{http://www.w3.org/2001/XMLSchema}string″
id=″CAAAF143_2956_454D_8AF3_8E59F56BBA4E″minOccurs=″0″
maxOccurs=″100000″/>;子元素url
<XmlMappingElement
name=″{element}{http://org.xmldb.personnel}url″ocalName=″url″
elementType=″complex″
type=″{element}{http://org.xmldb.personnel}url″
id=″2E1E9830_AB88_4DC8_8B72_A3DE735CA329″/>;子元素addresses
<XmlMappingElement
name=″{element}{http://org.xmldb.personnel}person/addresses″
localName=″addresses″elementType=″complex″
type=″{element}{http://org.xmldb.personnel}person/addresses″
id=″1D2AA93A_0DEF_4924_A88F_C433515B20F6″/>
</XmlMappingType>;复杂类型{element}{http://org.xmldb.personnel}name
<XmlMappingType id=″45E5901B_C36F_4F9E_8888_ADB29B816770″
name=″{element}{http://org.xmldb.personnel}name″
namespace=″http://org.xmldb.personnel″>;子元素family
<XmlMappingElement
name=″{element}{http://org.xmldb.personnel}family″
localName=″family″elementType=″simple″
type=″{type}{http://www.w3.org/2001/XMLSchema}string″
id=″3DC9DBB9_9E7E_4CF4_BDA8_A0AF486E5364″minOccurs=″1″
maxOccurs=″1″/>;子元素given
<XmlMappingElement
name=″{element}{http://org.xmldb.personnel}given″localName=″given″
elementType=″simple″
type=″{type}{http://www.w3.org/2001/XMLSchema}string″
id=″11B6ACF7_CC08_415C_8650_FB5730BE0137″minOccurs=″1″
maxOccurs=″1″/>
</XmlMappingType>;复杂类型{element}{http://org.xmldb.personnel}url
<XmlMappingType id=″22F2B421_815E_4E95_9D49_C67FA72D5265″
name=″{element}{http://org.xmldb.personnel}url″
namespace=″http://org.xmldb.personnel″>;子元素href
<XmlMappingElement name=″href″localName=″href″
elementType=″attribute″
type=″{type}{http://www.w3.org/2001/XMLSchema}string″
id=″5ACA5FFB_8E8A_4E9A_A17F_86FFCD1EE1EC″/>
</XmlMappingType>;复杂类型{element}{http://org.xmldb.personnel}person/addresses
<XmlMappingType id=″3E043791_8941_471A_A95D_A3DC796BBD5C″
name=″{element}{http://org.xmldb.personnel}person/addresses″
namespace=″http://org.xmldb.personnel″>;子元素address
<XmlMappingElement
name=″{element}{http://org.xmldb.address}address″
localName=″address″elementType=″complex″
type=″{element}{http://org.xmldb.address}address″
id=″35CE114E_D191_4534_A321_9BA88F9CB0BF″/>
</XmlMappingType>
</XmlMappingTypes>
同理,address.xsd生成的映射文件mapping-address.xml为:<XmlMapping>
<XmlMappingTypes>
<XmlMappingType id=″35CE114E_D191_4534_A321_9BA88F9CB0BF″
name=″{element}{http://org.xmldb.address}address″
namespace=″http://org.xmldb.address″>
<XmlMappingElement name=″{element}{http://org.xmldb.address}address/tel″
localName=″tel″
elementType=″simple″
type=″{type}{http://www.w3.org/2001/XMLSchema}string″
id=″212928B8_D160_4134_B8F3_C506103FFB82″
minOccurs=″1″maxOccurs=″1″/>
<XmlMappingElement name=″{element}{http://org.xmldb.address}address/postcode″
localName=″postcode″
elementType=″simple″
type=″{type}{http://www.w3.org/2001/XMLSchema}string″
id=″46BFC031_7FA7_48ED_A73E_E82184BB67B5″
minOccurs=″1″maxOccurs=″1″/>
<XmlMappingElement name=″{element}{http://org.xmldb.address}address/street″
localName=″street″
elementType=″simple″
type=″{type}{http://www.w3.org/2001/XMLSchema}string″
id=″AD2EEE92_A353_4127_AEC1_84B5851F1E98″
minOccurs=″1″maxOccurs=″1″/>
</XmlMappingType>
</XmlMappingTypes>
<XmlMappingElements>
<XmlMappingElement name=″{element}{http://org.xmldb.address}address″
localName=″address″
elementType=″complex″
type=″{element}{http://org.xmldb.address}address″
id=″0430D375_32FE_4072_B254_C71C664456B3″/>
</XmlMappingElements></XmlMapping>
下面根据映射文件mapping-personal.xml生成关系数据库表。
首先对于mapping-personal.xml中的每一个XmlMappingType生成一张表,为了使表名唯一,本例采用XmlMappingType中的id作为该表的表名;
其次将XmlMappingType所包含的所有属性和出现小于等于一次的简单类型元素作为该表的字段;
再者对于出现不止一次的简单类型元素生成一张子表,其表名为XmlMappingElement的id;
最后,对所有生成的表都建立公共字段:uuid_id,uuid_name,uuid_docid,uuid_parented,uuid_order。
注:对于一个复杂类型元素只生成一张表,不管该复杂类型是由哪个xmlschema所引用。这样使生成的表不依赖于引用复杂类型的xml schema,而只依赖于定义该复杂类型元素的xml schema。因而使所有相同类型的元素都会存储在一起,不管其来源,从而有利于对特定元素的查询。对于mapping-personal.xml中有五个XmlMappingType元素,同时简单类型元素{element}{http://org.xmldb.personnel}email的最大出现次数大于1,故应生成六张表,将生成表的情况存放在数据库系统表complextype中为:
ID | NAMESPACE | NAME | TYPE |
94737D4C_F969_48FF_A4A1_823FA8647BAD | http://org.xmldb.personnel | {element}{http://org.xmldb.personnel}personnel | complextype |
D62E1F94_35CA_4362_BB4E_DC39C58EACA3 | http://org.xmldb.personnel | {element}(http://org.xmldb.personnel}person | complextype |
CAAAF143_2956_454D_8AF3_8E59F56BBA4E | http://org.xmldb.personnel | {element}{http://org.xmldb personnel}person/email | dupelement |
45E5901B_C36F_4F9E_8888_ADB29B816770 | http://org.xmldb.personnel | {element}{http://org.xmldb.personnel}name | complextype |
22F2B421_815E_4E95_9D49_C67FA72D5265 | http://org.xmldb.personnel | {element}{http://org.xmldb.personnel}url | complextype |
3E043791_8941_471A_A95D_A3DC796BBD5C | http://org.xmldb.personnel | {element}{http://org.xmldb.personnel}person/addresses | complextype |
其中每张表都包含如下公共字段:(其中AB8E7A48_544A_48E3_8E4C_81268F986E10为本例指定的UUID)
列名 |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ID |
AB8E7A48_544A_48E3_8E4C_81268F986E10_INSTANCEID |
AB8E7A48_544A_48E3_8E4C_81268F986E10_NAME |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ORDER |
AB8E7A48_544A_48E3_8E4C_81268F986E10_PARENTID |
对于每张表除了包含上述公共字段外,还包含了schema定义的所属类型的所有属性和简单类型元素的字段。
表94737D4C_F969_48FF_A4A1_823FA8647BAD({element}{http://org.xmldb.personnel}personnel)包含的字段为:
列名 |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ID |
AB8E7A48_544A_48E3_8E4C_81268F986E10_INSTANCEID |
AB8E7A48_544A_48E3_8E4C_81268F986E10_NAME |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ORDER |
AB8E7A48_544A_48E3_8E4C_81268F986E10_PARENTID |
表D62E1F94_35CA_4362_BB4E_DC39C58EACA3({element}{http://org.xmldb.personnel}person)包含的字段为:
列名 |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ID |
AB8E7A48_544A_48E3_8E4C_81268F986E10_INSTANCEID |
AB8E7A48_544A_48E3_8E4C_81268F986E10_NAME |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ORDER |
AB8E7A48_544A_48E3_8E4C_81268F986E10_PARENTID |
ID |
NOTE |
CONTR |
SALARY |
表CAAAF143_2956_454D_8AF3_8E59F56BBA4E({element}{http://org.xmldb.personnel}person/email)包含的字段为:
列名 |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ID |
AB8E7A48_544A_48E3_8E4C_81268F986E10_INSTANCEID |
AB8E7A48_544A_48E3_8E4C_81268F986E10_NAME |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ORDER |
AB8E7A48_544A_48E3_8E4C_81268F986E10_PARENTID |
表45E5901B_C36F_4F9E_8888_ADB29B816770({element}{http://org.xmldb.personnel}name)包含的字段为:
列名 |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ID |
AB8E7A48_544A_8E3_8E4C_81268F986E10_INSTANCEID |
AB8E7A48_544A_48E3_8E4C_81268F986E10_NAME |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ORDER |
AB8E7A48_544A_48E3_8E4C_81268F986E10_PARENTID |
FAMILY |
GIVEN |
表22F2B421_815E_4E95_9D49_C67FA72D5265({element}{http://org.xmldb.personnel}url)包含的字段为:
列名 |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ID |
AB8E7A48_544A_48E3_8E4C_81268F986E10_INSTANCEID |
AB8E7A48_544A_48E3_8E4C_81268F986E10_NAME |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ORDER |
AB8E7A48_544A_48E3_8E4C_81268F986E10_PARENTID |
HREF |
表3E043791_8941_471A_A95D_A3DC796BBD5C({element}{http://org.xmldb.personnel}person/addresses)包含的字段为:
列名 |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ID |
AB8E7A48_544A_48E3_8E4C_81268F986E10_INSTANCEID |
AB8E7A48_544A_48E3_8E4C_81268F986E10_NAME |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ORDER |
AB8E7A48_544A_48E3_8E4C_81268F986E10_PARENTID |
同理,根据映射文件mapping-address.xml,address.xsd中的全局元素address生成的表为:
表35CE114E_D191_4534_A321_9BA88F9CB0BF
列名 |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ID |
AB8E7A48_544A_48E3_8E4C_81268F986E10_INSTANCEID |
AB8E7A48_544A_48E3_8E4C_81268F986E10_NAME |
AB8E7A48_544A_48E3_8E4C_81268F986E10_ORDER |
AB8E7A48_544A_48E3_8E4C_81268F986E10_PARENTID |
TEL |
POSTCODE |
STREET |
下面以实例personal.xml为例来描述将元素值存入关系数据库表的过程。
实例Personal.xml为:<?xml version=″1.0″encoding=″UTF-8″?>;名称空间为http://org.xmldb.personnel<personnel xmlns=http://org.xmldb.personnel xmlns:xsi=″http://www.w3.org/2001/XMLSchema-instance″
xsi:schemaLocation=″http://org.xmldb.personnel personal.xsd″xmlns:addr=″http://org.xmldb.address″>
<person id=″id1″salary=″500″>
<name>
<family>张</family>
<given>三</given>
</name>
<email>a@a.com</email>
<addresses>
<addr:address>
<addr:tel>1234567</addr:tel>
<addr:postcode>100005</addr:postcode>
<addr:street>科学院</addr:street>
</addr:address>
</addresses>
</person>
<person id=″id2″salary=″500″>
<name>
<family>李</family>
<given>四</given>
</name>
<email>b@b.com</email>
<email>c@c.com</email>
<addresses>
<addr:address>
<addr:tel>789898</addr:tel>
<addr:postcode>100006</addr:postcode>
<addr:street>北京大学</addr:street>
</addr:address>
</addresses>
</person></personnel>
首先,解析可扩展标记语言文件以获得文档对象模型(dom树);
其次,递归处理dom树的各层节点及节点的属性,并对每一个节点重复下述过程:
利用mapping文件找到该节点的“elementType”和“type”,
若elementType为简单类型(simple)且出现次数小于等于一,将该节点值插入父节点表中的对应字段,
若elementType为简单类型(simple)且出现次数不止一次,将节点值插入该节点对应的表中;
若elementType为复杂类型(complex),将节点值插入该节点的复杂类型元素所对应的表中,同时分析节点的属性,将所有属性值插入表中对应字段。
将符合personal.xsd定义的xml实例文档personal.xml存储在关系数据库表中的结果为(为方便起见,在本文中将公共字段的“AB8E7A48_544A_48E3_8E4C_81268F986E10”省略,只保留“_”,同时由于所有此文档相关记录的字段“AB8E7A48_544A_48E3_8E4C_81268F986E10_INSTANCEID”值相同,这里不予列出):
表94737D4C_F969_48FF_A4A1_823FA8647BAD({element}{http://org.xmldb.personnel}personnel)存储结果为:
_ID | _NAME | _ORDER | _PARENTID |
C1582E5B_9C2C_410B_9547_CB7FEAF5EF2E | personnel | 1 | null |
表D62E1F94_35CA_4362_BB4E_DC39C58EACA3({element}{http://org.xmldb.personnel}person)存储结果为:
_ID | _NAME | _ORDER | _PARENTID | ID | NOTE | CONTR | SALARY |
098C3309_C363_47EE_AEF3_A55 | person | 2 | C1582E5B_9C2C_410B_95477_CB | id1 | null | FALSE | 500 |
C0BAF441_5C4A4490_B518_F0 | person | 7 | C1582E5B_9C2C_410B_9547_CB | id2 | null | FALSE | 500 |
表CAAAF143_2956_454D_8AF3_8E59F56BBA4E({element}{http://org.xmldb.personnel}person/email)存储结果为:
_ID | _NAME | _ORDER | _PARENTID | |
24CFED82_2357_4BE1_9A1D_AF0BCED340B9 | 4 | 098C3309_C363_47EE_AEF3_A55993E7FF83 | a@a.com | |
2B2B49BD_4D7E_4868_866D_B82F2E02D4B3 | 9 | C0BAF441_5C4A_4490_B518_F085185A9E23 | b@b.com | |
9645D167_E1BA_4FA9_B113_C1F74177FF6B | 10 | C0BAF441_5C4A_4490_B518_F085185A9E23 | c@c.com |
表45E5901B_C36F_4F9E_8888_ADB29B816770({element}{http://org.xmldb.personnel}name)存储结果为:
_ID | _NAME | _ORDER | _PARENTID | FAMILY | GIVEN |
8876F44A_8324_4A70_8789_ED30CB307CB8 | name | 3 | 098C3309_C363_47EE_AEF3_A55993E7FF83 | 张 | 三 |
993538B3_3ADC_43A9_A9F3_A61B7C9530E1 | name | 8 | C0BAF441_5C4A_4490_B518_F085185A9E23 | 李 | 四 |
表22F2B421_815E_4E95_9D49_C67FA72D5265({element}{http://org.xmldb.personnel}url)的记录为空。
表3E043791_8941_471A_A95D_A3DC796BBD5C({element}{http://org.xmldb.personnel}person/addresses)的存储结果为:
_ID | _NAME | _ORDER | _PARENTID |
39E02917_F0A5_4B43_910B_8676B51E0CB4 | addresses | 5 | 098C3309_C363_47EE_AEF3_A55993E7FF83 |
11C39464_DA22_48C8_80F8_DEAF25D84AA2 | addresses | 11 | C0BAF441_5C4A_4490_B518_F085185A9E23 |
由于“personal.xsd”中引入了schema“address.xsd”,所以“personal.xml”文档中元素“addr:address”的信息会插入导入“address.xsd”时所创建的复杂类型“{element}{http://org.xmldb.address}address”表中,故
表35CE114E_D191_4534_A321_9BA88F9CB0BF({element}{http://org.xmldb.address}address)存储结果为:
_ID | _NAME | _ORDER | _PARENTID | TEL | POSTCODE | STREET |
A0364D74_CB21_40A9_8EB0_DD7 | address | 6 | 39E02917_F0A5_4B43_910B_867 | 1234567 | 100005 | 科学院 |
CB9AAF4C_83B4_4248_A7F0_D88 | address | 12 | 11C39464_DA22_48C8_80F8_DEA | 789898 | 100006 | 北京大学 |
相应地,如图6所示,一种可扩展标记语言文件元素值插入关系数据库表的方法包括下述步骤:
a)获取可扩展标记语言文件所属的可扩展标记语言文件模式;
b)根据模式所定义的名称空间从数据库中读出可扩展标记语言文件的数据库映射文件;
c)遍历可扩展标记语言文件,将可扩展标记语言文件元素值插入相应的关系数据库表中。
所述步骤a)又进一步细分为下述步骤:
a0)获取可扩展标记语言文件的名称空间;
a1)通过名称空间获取相应的可扩展标记语言模式,并验证可扩展标记语言文件的合法性。
所述步骤b)又进一步细分为下述步骤:
b0)根据名称空间获取其引用的名称空间;
b1)对每一个名称空间获取其对应的映射文件,并组装成一个完整的映射文件。
所述步骤c)又进一步细分为下述步骤:
c0)解析可扩展标记语言文件以获得文档对象模型;
对所述文档对象模型中的每一个节点,执行步骤c1)至步骤c4):
c1)通过映射文件得到该节点的属性:元素类别(elementType)和元素类型(type);
c2)若元素类别为简单类型(simple),且出现次数小于等于一次,将该节点值插入其父节点对应的关系数据库表中;
c3)若元素类别为简单类型,且出现至少一次,将该节点值插入其对应的关系数据库表中;
c4)若元素类别为复杂类型(complex),将该节点值插入其对应的关系数据库表中,且将该节点的属性值插入该关系数据库表中的相应字段中。
下面也以xml文件personal.xml为例来详述本发明可扩展标记语言文件元素值插入关系数据库表的方法的技术方案。
采用通用解析器,例如:apache的xerces解析器,得出文件personal.xml所定义的namespace为http://org.xmldb.personnel,根据此namespace查询数据库系统表“schema”中的记录,找出其相应的Schema及其所引用的namespace,用获得的Schema对xml文件进行验证,如果验证通过,说明xml文件是有效的。对每个namespace查询数据库系统表“schema”中的记录,找出该namespace的mapping,并将xml元素映射集合(XmlMappingElements)节点和xml类型映射集合(XmlMappingTypes)节点的子节点进行合并,组装成一个完整的mapping,获取mapping以后,就可以根据mapping将xml文件中的元素值插入到关系数据库中,具体的做法是:
使用通用的xml解析器解析personal.xml,获取其文档对象模型(dom树),dom树为一种内存中的数据结构,由解析器自动构造,并提供标准的API处理dom树,递归处理dom树的各层节点及节点的属性。
首先为personnel节点,根据mapping找到它的elementType是“complex”,type是“{element}{http://org.xmldb.personnel}person”,然后根据type值在mapping中找到对应的XmlMappingType,读出该类型的序号id值是“94737D4C_F969_48FF_A4A1_823FA8647BAD”,根据id值找到相应的数据库表,并在表中插入一条记录,结果如下:
表94737D4C_F969_48FF_A4A1_823FA8647BAD({element}{http://org.xmldb.personnel}name)存储结果:
_ID | _NAME | _ORDER | _PARENTID |
C1582E5B_9C2C_410B_9547_CB7FEAF5EF2E | personnel | 1 | null |
其中字段_ID为自动生成的personnel节点的UUID标识,_NAME为personnel节点的本地名称,_ORDER为personnel节点在xml文档中出现的顺序,_PARENTID为personnel节点的父节点的UUID标识。
递归的下一步是person节点,根据mapping找到person节点的elementType是“complex”,type是“{element}{http://org.xmldb.personnel}person”,找到type对应的XmlMappingType的id值是“D62E1F94_35CA_4362_BB4E_DC39C58EACA3”,根据id值找到相应的数据库表,并在表中插入一条记录,结果如下:
表D62E1F94_35CA_4362_BB4E_DC39C58EACA3({element}{http://org.xmldb.personnel}person)存储结果:
_ID | _NAME | _ORDER | _PARENTID | ID | NOTE | CONTR | SALARY |
098C3309_C363_47EE_AEF3_A55 | person | 2 | C1582E5B_9C2C_410B_9547_CB | id1 | null | FALSE | 500 |
其中字段ID、NOTE、CONTR、SALARY为person节点的属性所对应的字段,字段_PARENTID为父节点personnel节点的id。
接着递归处理person节点的name子节点,根据mapping找到name节点的elementType是“complex”,type是“{element}{http://org.xmldb.personnel}name”,找到type对应的XmlMappingType的id值是“45E5901B_C36F_4F9E_8888 ADB29B816770”,根据id值找到相应的数据库表,并在表中插入一条记录,结果如下:
表45E5901B_C36F_4F9E_8888_ADB29B816770({element}{http://org.xmldb.personnel}name)存储结果:
_ID | _NAME | _ORDER | _PARENTID | FAMILY | GIVEN |
8876F44A_8324_4A70_8789_ED30CB307CB8 | name | 3 | 098C3309_C363_47EE_AEF3_A55993E7FF83 |
接着递归处理name节点的子节点fammily节点和given节点,根据mapping可知他们的elementType是simple,因此找到父节点name节点所对应的表,并将值插入此表的相应字段,结果如下:
表45E5901B_C36F_4F9E_8888_ADB29B816770({element}{http://org.xmldb.personnel}name)存储结果:
_ID | _NAME | _ORDER | _PARENTID | FAMILY | GIVEN |
8876F44A_8324_4A70_8789_ED30CB307CB8 | name | 3 | 098C3309_C363_47EE_AEF3_A55993E7FF83 | 张 | 三 |
同样递归处理person节点的子节点email子节点和addresses子节点,存储结果如下:
表CAAAF143_2956_454D_8AF3_8E59F56BBA4E({element}{http://org.xmldb.personnel}person/email)存储结果:
_ID | _NAME | _ORDER | _PARENTID | |
24CFED82_2357_4BE1_9A1D_AF0BCED340B9 | 4 | 098C3309_C363_47EE_AEF3_A55993E7FF83 | a@a.com |
表3E043791_8941_471A_A95D_A3DC796BBD5C({element}{http://org.xmldb.personnel}person/addresses):
_ID | _NAME | _ORDER | _PARENTID |
39E02917_F0A5_4B43_910B_8676B51E0CB4 | addresses | 5 | 098C3309_C363_47EE_AEF3_A55993E7FF83 |
由于“personal.xsd”中引入了schema“address.xsd”,所以“personal.xml”文档中元素“addr:address”的信息会插入导入“address.xsd”时所创建的“{element}{http://org.xmldb.address}address”表中,其结果如下:
表35CE114E_D191_4534_A321_9BA88F9CB0BF({element}{http://org.xmldb.address}address)存储结果:
_ID | _NAME | _ORDER | _PARENTID | TEL | POSTCODE | STREET |
A0364D74_CB21_40A9_8EB0_DD7 | address | 6 | 39E02917_F0A5_4B43_910B_867 | 1234567 | 100005 | 科学院 |
至此第一个person节点及其子节点递归处理完毕,按照同样的步骤处理第二个person节点及其子节点,存储后结果如下:
表D62E1F94_35CA_4362_BB4E_DC39C58EACA3({element}{http://org.xmldb.personnel}person)存储结果:
_ID | _NAME | _ORDER | _PARENTID | ID | NOTE | CONTR | SALARY |
098C3309_C363_47EE_AEF3_A55 | person | 2 | C1582E5B_9C2C_410B_9547_CB | id1 | null | FALSE | 500 |
C0BAF441_5C4A_4490_B51a_F0 | person | 7 | C1582E5B_9C2C_410B_9547_CB | id2 | null | FALSE | 500 |
表CAAAF143_2956_454D_8AF3_8E59F56BBA4E({element}{http://org.xmldb.personnel}person/email)存储结果:
_ID | _NAME | _ORDER | _PARENTID | |
24CFED82_2357_4BE1_9A1D_AF0BCED340B9 | 4 | 098C3309_C363_47EE_AEF3_A55993E7FF83 | a@a.com | |
2B2B49BD_4D7E_4868_866D_B82F2E02D4B3 | 9 | C0BAF441_5C4A_4490_B518_F085185A9E23 | b@b.com | |
9645D167_E1BA_4FA9_B113_C1F74177FF6B | 10 | C0BAF441_5C4A_4490_B518_F085185A9E23 | c@c.com |
表45E5901B_C36F_4F9E_8888_ADB29B816770({element}{http://org.xmldb.personnel}name)存储结果:
_ID | _NAME | _ORDER | _PARENTID | FAMILY | GIVEN |
8876F44A_8324_4A70_8789_ED30CB307CB8 | name | 3 | 098C3309_C363_47EE_AEF3_A55993E7FF83 | 张 | 三 |
993538B3_3ADC_43A9_A9F3_A61B7C9530E1 | name | 8 | C0BAF441_5C4A_4490_B518_F085185A9E23 | 李 | 四 |
表3E043791_8941_471A_A95D_A3DC796BBD5C({element}{http://org.xmldb.personnel}person/addresses)存储结果:
_ID | _NAME | _ORDER | _PARENTID |
39E02917_F0A5_4B43_910B_8676B51E0CB4 | addresses | 5 | 098C3309_C363_47EE_AEF3_A55993E7FF83 |
11C39464_DA22_48C8_80F8_DEAF25D84AA2 | addresses | 11 | C0BAF441_5C4A_4490_B518_F085185A9E23 |
表35CE114E_D191_4534_A321_9BA88F9CB0BF({element}{http://org.xmldb.address}address)存储结果:
_ID | _NAME | _ORDER | _PARENTID | TEL | POSTCODE | STREET |
A0364D74_CB21_40A9_8EB0_DD7 | address | 6 | 39E02917_F0A5_4B43_910B_867 | 1234567 | 100005 | 科学院 |
CB9AAF4C_83B4_4248_A7F0_D88 | address | 12 | 11C39464_DA22_48C8_80F8_DEA | 789898 | 100006 | 北京大学 |
上述所有关系数据库表中省略了相同的公共字段“docInstanceId”,在实际使用中,可以在记录中加入personal.xml的文档实例标识(docInstanceId)的值,以表明这些记录所描述的节点同属此文件。另外由于所要插入的xml文件personal.xml中没有可选节点url节点,因此表22F2B421_815E_4E95_9D49_C67FA72D5265({element}{http://org.xmldb.personnel}url)的记录为空。至此已完成将xml文件personal.xml的元素值插入关系数据库表中。
以上所述仅是本发明可扩展标记语言文件存储及插入关系数据库表的方法的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明可扩展标记语言文件存储及插入关系数据库表的方法原理的前提下,还可以作出若干改进和润饰,这些改进和润饰也应视为本发明可扩展标记语言文件存储及插入关系数据库表的方法的保护范围。
Claims (10)
1、一种可扩展标记语言文件存储方法,其特征在于,包括下述步骤:
10)将模式间的依赖关系存放在关系数据库系统表中;
20)为可扩展标记语言文件中的每一个名称空间创建一个映射文件,所述映射文件包括该模式中所有的复杂类型、简单类型、全局元素以及相应子元素;
30)为映射文件中每一个复杂类型、全局元素以及出现不止一次的简单类型元素分别生成一个与其对应的关系数据库表,其所包含子元素和出现小于等于一次的简单类型作为与其对应的关系数据库表中的字段;
40)将可扩展标记语言文件的元素值及其属性值插入与其对应的数据库表中。
2、如权利要求1所述的可扩展标记语言文件存储方法,其特征在于,所述步骤20)进一步细分为下述步骤:
200)获取可扩展标记语言文件的模式对象模型;
201)根据模式对象模型获取每一个模式所对应的名称空间并为每一个名称空间创建一个映射文件;
重复步骤202)至208)填充每一个映射文件,
202)获取每个名称空间的全部全局元素和复杂类型;
203)为每一个全局元素生成一个可扩展标记语言元素映射节点,并设置与其相应的属性;
204)生成可扩展标记语言元素映射集合节点,且该集合节点包含步骤203)中生成的所有节点;
205)为每一个复杂类型生成一个可扩展标记语言类型节点,并设置与其相应的属性;
206)找出每一个复杂类型所包含的所有子元素;
207)为每一个子元素生成一个可扩展标记语言元素节点并将其放入其所属的复杂类型的扩展标记语言类型节点中;
208)生成可扩展标记语言类型集合节点,该集合节点包括步骤205)中生成的所有可扩展标记语言类型节点。
3、如权利要求2所述的可扩展标记语言文件存储方法,其特征在于,所述与可扩展标记语言类型节点相应的属性为:
复杂类型标识,id,用于标识该复杂类型
名称,name,用于表示该复杂类型的全局名称
名字空间,namespace,用于表示该复杂类型的名字空间;
与可扩展标记语言元素节点相应的属性为:
名称,name,用于表示该元素的全局名称
原始名称,localName,用于表示由模式对象模型指定的该元素的原始名称
元素类别,elementType,用于表示该元素的类别
元素类型,type,用于表示该元素的类型
元素标识,id,用于标识该元素。
4、如权利要求3所述的可扩展标记语言文件存储方法,其特征在于,所述步骤30)进一步细分为下述步骤:
300)为映射文件中的每一个可扩展标记语言类型节点生成一个关系数据库表,表名为其属性复杂类型标识;
301)将每一个可扩展标记语言类型节点所包含的所有属性和出现小于等于一次的简单类型元素作为与其相应的关系数据库表的字段;
302)为每一个出现不止一次的简单类型元素生成一个子关系数据库表,该表名为其属性元素标识;
303)为每一个关系数据库表建立下列字段:
记录序号,uuid_id,用于表示记录顺序
实例元素名称,uuid_name,用于表示可扩展标记语言文件实例中该元素的名称
实例标识,uuid_docid,用于标识可扩展标记语言文件实例
父元素标识,uuid_parentid,用于标识该元素的父元素
元素顺序,uuid_order,用于表示可扩展标记语言文件实例中元素出现的顺序。
5、如权利要求4所述的可扩展标记语言文件存储方法,其特征在于,还包括步骤建立数据库系统表,所述数据库系统表包括:
模式引用关系表,Schemacrossref,用于存放可扩展标记语言文件模式间的依赖关系;
模式表,Schema,用于存放可扩展标记语言文件模式与其对应的映射文件的对应关系;
文件实例表,DocInstance,用于存放可扩展标记语言文件存储标识。
6、如权利要求1至5所述的任意一种可扩展标记语言文件存储方法,其特征在于,所述步骤40)又进一步分为下述步骤:
400)解析可扩展标记语言文件以获得文档对象模型;
对所述文档对象模型中的每一个节点,执行步骤401)至步骤404):
401)通过映射文件得到该节点的属性:元素类别;
402)若元素类别为简单类型,且出现次数小于等于一次,将该节点值插入其父节点对应的关系数据库表中;
403)若元素类别为简单类型,且出现至少一次,将该节点值插入其对应的关系数据库表中;
404)若元素类别为复杂类型,将该节点值插入其对应的关系数据库表中,且将该节点的属性值插入该关系数据库表中的相应字段中。
7、一种可扩展标记语言文件元素值插入关系数据库表的方法,其特征在于,包括下述步骤:
a)获取可扩展标记语言文件所属的可扩展标记语言文件模式;
b)根据模式所定义的名称空间从数据库中读出可扩展标记语言文件的数据库映射文件;
c)遍历可扩展标记语言文件,将可扩展标记语言文件元素值插入相应的关系数据库表中。
8、如权利要求7所述的可扩展标记语言文件元素值插入关系数据库表的方法,其特征在于,所述步骤a)又进一步细分为下述步骤:
a0)获取可扩展标记语言文件的名称空间;
a1)通过名称空间获取相应的可扩展标记语言模式,并验证可扩展标记语言文件的合法性。
9、如权利要求8所述的可扩展标记语言文件元素值插入关系数据库表的方法,其特征在于,所述步骤b)又进一步细分为下述步骤:
b0)根据名称空间获取其引用的名称空间;
b1)对每一个名称空间获取其对应的映射文件,并组装成一个完整的映射文件。
10、如权利要求9所述的可扩展标记语言文件元素值插入关系数据库表的方法,其特征在于,所述步骤c)又进一步细分为下述步骤:
c0)解析可扩展标记语言文件以获得文档对象模型;
对所述文档对象模型中的每一个节点,执行步骤c1)至步骤c4):
c1)通过映射文件得到该节点的属性:元素类别;
c2)若元素类别为简单类型,且出现次数小于等于一次,将该节点值插入其父节点对应的关系数据库表中;
c3)若元素类别为简单类型,且出现至少一次,将该节点值插入其对应的关系数据库表中;
c4)若元素类别为复杂类型,将该节点值插入其对应的关系数据库表中,且将该节点的属性值插入该关系数据库表中的相应字段中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200410102754 CN1622095A (zh) | 2004-12-27 | 2004-12-27 | 可扩展标记语言文件存储及插入关系数据库表的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN 200410102754 CN1622095A (zh) | 2004-12-27 | 2004-12-27 | 可扩展标记语言文件存储及插入关系数据库表的方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN1622095A true CN1622095A (zh) | 2005-06-01 |
Family
ID=34766840
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200410102754 Pending CN1622095A (zh) | 2004-12-27 | 2004-12-27 | 可扩展标记语言文件存储及插入关系数据库表的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1622095A (zh) |
Cited By (11)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101300577B (zh) * | 2005-11-07 | 2011-03-16 | 微软公司 | 部分xml确认 |
CN104657443A (zh) * | 2015-02-04 | 2015-05-27 | 国家电网公司 | 一种基于xml原生数据库的电网数据模型混合式存取方法 |
CN105117447A (zh) * | 2015-08-13 | 2015-12-02 | 浪潮(北京)电子信息产业有限公司 | 一种xml文档数据的处理方法及系统 |
CN105404662A (zh) * | 2014-08-29 | 2016-03-16 | 北京未名博思生物智能科技开发有限公司 | 不使用结构化查询语言的数据库 |
CN105808595A (zh) * | 2014-12-31 | 2016-07-27 | 北京航天测控技术有限公司 | 一种规范文件的数据库生成方法及装置 |
CN105897706A (zh) * | 2016-04-01 | 2016-08-24 | 厦门卫星定位应用股份有限公司 | 一种交通数据的通用解析处理方法 |
CN106104526A (zh) * | 2014-02-19 | 2016-11-09 | 斯诺弗雷克计算公司 | 半结构化数据模式的透明发现 |
CN108319684A (zh) * | 2018-01-31 | 2018-07-24 | 国信优易数据有限公司 | 一种可扩展标记语言xml文件的存储方法及装置 |
CN105069074B (zh) * | 2015-07-30 | 2018-11-20 | 江苏天联信息科技发展有限公司 | 策略配置文件处理方法、装置和系统 |
CN110020358A (zh) * | 2017-11-07 | 2019-07-16 | 北京京东尚科信息技术有限公司 | 用于生成动态页面的方法和装置 |
CN111984739A (zh) * | 2019-05-24 | 2020-11-24 | 中移(苏州)软件技术有限公司 | 一种xml与关系型数据库的转换方法、终端和存储介质 |
-
2004
- 2004-12-27 CN CN 200410102754 patent/CN1622095A/zh active Pending
Cited By (16)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101300577B (zh) * | 2005-11-07 | 2011-03-16 | 微软公司 | 部分xml确认 |
CN106104526A (zh) * | 2014-02-19 | 2016-11-09 | 斯诺弗雷克计算公司 | 半结构化数据模式的透明发现 |
CN106104526B (zh) * | 2014-02-19 | 2020-02-04 | 斯诺弗雷克公司 | 半结构化数据模式的透明发现 |
CN105404662A (zh) * | 2014-08-29 | 2016-03-16 | 北京未名博思生物智能科技开发有限公司 | 不使用结构化查询语言的数据库 |
CN105404662B (zh) * | 2014-08-29 | 2018-06-19 | 北京未名博思生物智能科技开发有限公司 | 不使用结构化查询语言的数据库 |
CN105808595B (zh) * | 2014-12-31 | 2019-07-19 | 北京航天测控技术有限公司 | 一种规范文件的数据库生成方法及装置 |
CN105808595A (zh) * | 2014-12-31 | 2016-07-27 | 北京航天测控技术有限公司 | 一种规范文件的数据库生成方法及装置 |
CN104657443A (zh) * | 2015-02-04 | 2015-05-27 | 国家电网公司 | 一种基于xml原生数据库的电网数据模型混合式存取方法 |
CN105069074B (zh) * | 2015-07-30 | 2018-11-20 | 江苏天联信息科技发展有限公司 | 策略配置文件处理方法、装置和系统 |
CN105117447A (zh) * | 2015-08-13 | 2015-12-02 | 浪潮(北京)电子信息产业有限公司 | 一种xml文档数据的处理方法及系统 |
CN105897706A (zh) * | 2016-04-01 | 2016-08-24 | 厦门卫星定位应用股份有限公司 | 一种交通数据的通用解析处理方法 |
CN105897706B (zh) * | 2016-04-01 | 2019-01-18 | 厦门卫星定位应用股份有限公司 | 一种交通数据的通用解析处理方法 |
CN110020358A (zh) * | 2017-11-07 | 2019-07-16 | 北京京东尚科信息技术有限公司 | 用于生成动态页面的方法和装置 |
CN110020358B (zh) * | 2017-11-07 | 2021-08-17 | 北京京东尚科信息技术有限公司 | 用于生成动态页面的方法和装置 |
CN108319684A (zh) * | 2018-01-31 | 2018-07-24 | 国信优易数据有限公司 | 一种可扩展标记语言xml文件的存储方法及装置 |
CN111984739A (zh) * | 2019-05-24 | 2020-11-24 | 中移(苏州)软件技术有限公司 | 一种xml与关系型数据库的转换方法、终端和存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1155906C (zh) | 数据处理方法、系统、处理程序及记录媒体 | |
CN1170240C (zh) | 结构化文档检索显示方法和装置 | |
CN1204515C (zh) | 自由格式数据处理的方法和设备 | |
CN1097795C (zh) | 结构式文件处理方法和装置 | |
CN1293500C (zh) | 组织计算机网络中电子邮件文档的方法及电子邮件系统 | |
CN1866253A (zh) | 把Web服务映射到本体 | |
CN1766886A (zh) | 用于数据管理和/或转换的数据结构、数据库系统及方法 | |
CN1689022A (zh) | 可扩展标记语言流化转换器 | |
CN1750003A (zh) | 信息处理装置,信息处理方法,和程序 | |
CN1126053C (zh) | 文件检索方法、文件检索发送方法及装置 | |
CN1501285A (zh) | 排版系统、排版程序和排版方法 | |
CN1797399A (zh) | 用于文本挖掘和搜索的应用程序编程接口 | |
CN1592905A (zh) | 自动产生数据库查询的系统和方法 | |
CN1609855A (zh) | 查询优化系统和方法 | |
CN1749999A (zh) | .net数据类型和实例的持久存储 | |
CN1604082A (zh) | 用于任意数据模型的映射体系结构 | |
CN1752963A (zh) | 文档信息处理设备、文档信息处理方法及处理程序 | |
CN101030138A (zh) | 应用构架 | |
CN1744036A (zh) | 报告软件中支持定制图形表示的系统和方法 | |
CN1359081A (zh) | 结构编辑装置、目标内容结构的管理及显示方法和记录媒体 | |
CN101040292A (zh) | 数据管理装置及其方法 | |
CN1551012A (zh) | 编排系统、编排程序和编排方法 | |
CN1447261A (zh) | 特定要素、字符串向量生成及相似性计算的装置、方法 | |
CN1761956A (zh) | 基于片段的串行化系统与方法 | |
CN1489087A (zh) | 检索关键字分析程序、系统和方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C02 | Deemed withdrawal of patent application after publication (patent law 2001) | ||
WD01 | Invention patent application deemed withdrawn after publication |