欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

可擴展標記語言文件導出方法

文檔序號:4482571閱讀:95來源:國知局
專利名稱:可擴展標記語言文件導出方法
技術領域
本發(fā)明涉及可擴展標記語言領域,尤指一種可擴展標記語言文件導出方法。
背景技術
隨著Internet的迅猛發(fā)展,xml(Extensible Markup Language,可擴展標記語言)作為Internet上數(shù)據(jù)表示的新標準,以其具有的自描述性、靈活性、擴展性和平臺無關性等優(yōu)勢,正在被廣泛的應用于各種Web應用中。
近年來許多研究工作致力于將數(shù)據(jù)庫技術應用于xml文件的處理上。利用數(shù)據(jù)庫成熟的技術來存儲xml文件。目前主流的xml數(shù)據(jù)庫形式是利用關系數(shù)據(jù)庫來存儲xml文件,例如Oracle9i、SQL Server 2000等關系數(shù)據(jù)庫。
利用關系數(shù)據(jù)庫存儲xml文件后,如何能夠快速“完整”地將xml文件導出,即取出原存入的xml文件而不缺失任何可解析信息是當前研究的熱點問題。

發(fā)明內容
本發(fā)明要解決的問題是提供一種能夠不缺失任何可解析信息而將可擴展標記語言文件導出的可擴展標記語言文件導出方法。
為了解決上述問題,本發(fā)明可擴展標記語言文件導出方法的技術方案包括下述步驟1)獲取可擴展標記語言文件所屬的可擴展標記語言文件模式;2)根據(jù)模式所定義的名稱空間從模式表中讀出可擴展標記語言文件的映射文件,所述模式表至少包括名稱空間和映射文件兩個字段;3)根據(jù)映射文件找到存儲該文檔的所有復雜類型和出現(xiàn)不止一次的簡單類型元素的數(shù)據(jù)庫表;4)根據(jù)可擴展標記語言文件的文檔實例標識從所述數(shù)據(jù)庫表中讀取屬于該文件的記錄,以及根據(jù)映射文件構造該文件的文檔對象模型;5)將文檔對象模型序列化成字符串以形成可擴展標記語言文件。所述步驟1)又進一步細分為下述步驟10)獲取可擴展標記語言文件的名稱空間;11)通過名稱空間獲取相應的可擴展標記語言模式并驗證模式的有效性。所述步驟2)又細分為下述步驟20)通過名稱空間獲取引用的名稱空間;21)對每一個名稱空間獲取其對應的映射文件并組裝成一個完整的映射文件。
所述步驟4)進一步細分為下述步驟
40)根據(jù)可擴展標記語言文件的文檔實例標識從所述數(shù)據(jù)庫表中讀取屬于該文件的記錄;41)根據(jù)記錄中元素的基本信息、父子關系以及元素在文件中出現(xiàn)的順序,依照映射文件構造出與其相應的元素節(jié)點;42)讀取元素記錄中的父節(jié)點信息以構造出該文件的文檔對象模型。
與現(xiàn)有技術相比,本發(fā)明可擴展標記語言文件導出方法的有益效果是一方面,由于采用將可擴展標記語言文件中的元素提取出來存放到關系數(shù)據(jù)庫表中,并不對其標簽等進行存儲,故所占用的存儲空間小。另外,本發(fā)明可擴展標記語言文件將每一個復雜類型元素、全局元素以及出現(xiàn)不止一次的簡單類型元素分別生成一個與其對應的關系數(shù)據(jù)庫表,不考慮該元素是由哪個xml schema所引用。這樣使生成的表不依賴于引用該元素的xmlschema,而只依賴于定義該元素的xml schema。因而使所有相同類型的元素一定共享相同的數(shù)據(jù)庫結構。當不同來源的元素導入數(shù)據(jù)庫時,它們會在這里匯集,存儲在一起,成為一個個數(shù)據(jù)團,這樣在查詢某一元素時,只查詢與其對應的表即可,而不必在考慮與其有關的xml schema,從而可實現(xiàn)對xml文件數(shù)據(jù)的高效查詢。
另一方面,由于在存儲xml文檔時記錄了元素的文檔索引和在文檔中出現(xiàn)的順序,在導出文檔時可以根據(jù)這些信息在數(shù)據(jù)庫中快速定位并讀出所需記錄,然后可以根據(jù)Schema的映射模板按照順序構造xml元素,使得序列化出的xml文檔不損失任何可解析的信息。因此本發(fā)明可擴展標記語言導出方法既可以實現(xiàn)xml快速有效的導出,同時又能保證“完整”的導出xml文檔,不缺失任何可解析信息。


圖1是本發(fā)明可擴展標記語言文件導出方法流程圖;圖2是圖1中步驟1)進一步劃分的流程圖;圖3是圖1中步驟2)進一步劃分的流程圖;圖4是圖1中步驟4)進一步劃分的流程圖;圖5是實施例中四個模式的依賴關系示意圖。
具體實施例方式
在介紹本發(fā)明可擴展標記語言文件導出方法的技術方案之前,先將xml文件存入關系數(shù)據(jù)庫表中,然后再采用本發(fā)明可擴展標記語言文件導出方法對存入關系數(shù)據(jù)庫表中的xml文件導出。
本例的xml文件有四個模式。
模式一company.xsd<?xml version=″1.0″encoding=″UTF-8″?>
<xsschema targetNamespace=″http//org.xmldb.company″xmlnsxs=″http//www.w3.org/2001/XMLSchema″xmlns=″http//org.xmldb.company″xmlnspcr=″http//org.xmldb.pcrsonncl″clcmcntFormDcfault=″qualificd″attributeFormDefault=″unqualified″>依賴模式personal.xsd<xsimport namespace=″http//org.xmldb.personnel″schemaLocation=″personal.xsd″/><xselement name=″company″>
<xsannotation>
<xsdocumentation>Comment describing your root element</xsdocumentation>
</xsannotation>
<xscomplexType>
<xssequence>
<xselement name=″employee″type=″employee″/>
<xselement name=″department″>
<xscomplexType>
<xssequence>
<xselement name=″manager″>
<xscomplexType>
<xssequence>
<xselement name=″ran k″ type=″xsstring″/>
<xselement ref=″perperson″/>
</xssequence>
</xscomplexType>
</xselement>
<xselement name=″name″type=″xsstring″/>
</xssequence>
</xscomplexType>
</xselement>
</xssequence>
</xscomplexType></xselement><xscomplexType name=″employee″>
<xssequence>
<xselement ref=″perperson″maxOccurs=″unbounded″/>
</xssequence></xscomplexType></xsschema>
模式二government.xsd<?xml version=″1.0″encoding=″UTF-8″?><xsschema targetNamespace=″http//org.xmldb.government″xmlnsxs=″http//www.w3.org/2001/XMLSchema″xmlnsper=″http//org.xmldb.personnel″xmlns=″http//org.xmldb.government″elementFormDefault=″qualified″attributeFormDefault=″unqualified″>;依賴模式personal.xsd<xsimport namespace=″http//org.xmldb.personnel″schemaLocation=″personal.xsd″/>
<xselement name=″government″>
<xsannotation>
<xsdocumentation>Comment describing your root element</xsdocumentation>
</xsannotation>
<xscomplexType>
<xssequence>
<xselement name=″officers″>
<xscomplexType>
<xssequence>
<xselement ref=″perperson″maxOccurs=″unbounded″/>
</xssequence>
</xscomplexType>
</xselement>
<xselement name=″name″type=″xsstring″/>
<xselement name=″affiliated″type=″xsstring″/>
</xssequence>
</xscomplexType>
</xselement></xsschema>
模式三personal.xsd<?xml version=″1.0″encoding=″UTF-8″?><xsschema targetNamespace=″http//org.xmldb.personnel″xmlnsxs=″http//www.w3.org/2001/XMLSchema″xmlns=″http//org.xmldb.personnel″xmlnsaddr=″http//org.xmldb.address″elementFormDefault=″qualified″>;依賴模式address.xsd<xsimport namespace=″http//org.xmldb.address″schemaLocation=″address.xsd″/>;模式定義的全局元素<xselement name=″personnel″>;模式定義的復雜類型<xscomplexType>
<xssequence>
<xselement ref=″person″maxOccurs=″unbounded″/>
</xssequence>
</xscomplexType>
<xsunique name=″uniquel″>
<xsselector xpath=″person″/>
<xsfield xpath=″name/given″/>
<xsfield xpath=″name/family″/>
</xsunique>
<xskey name=″empid″>
<xsselector xpath=″person″/>
<xsfield xpath=″@id″/>
</xskey>
<xskeyref name=″keyrefl″refer=″empid″>
<xsselector xpath=″person″/>
<xsfield xpath=″link/@manager″/>
</xskeyref></xselement>;模式定義的全局元素<xselement name=″person″>;模式定義的復雜類型<xscomplexType>
<xssequence>
<xselement ref=″name″/>;Schema定義的重復多次的簡單類型元素<xselement ref=″email″minOccurs=″0″maxOccurs=″unbounded″/>
<xselement ref=″url″minOccurs=″0″maxOccurs=″unbounded″/>
<xselement name=″addresses″>;模式定義的復雜類型<xscomplexType>
<xssequence maxOccurs=″unbounded″>
<xselement ref=″addraddress″/>
</xssequence>
</xscomplexType>
</xselement>
</xssequence>
<xsattribute name=″id″type=″xsID″use=″required″/>
<xsattribute name=″note″type=″xsstring″/>
<xsattribute name=″contr″default=″false>
<xssimpleType>
<xsrestriction base=″xsstring″>
<xsenumeration value=″true″/>
<xsenumeration value=″false″/>
</xsrestriction>
</xssimpleType>
</xsattribute>
<xsattribute name=″salary″type=″xsinteger″/>
</xscomplexType></xselement>;模式定義的全局元素<xselement name=″name″>;模式定義的復雜類型<xscomplexType>
<xsall>
<xselement ref=″tamily″/>
<xselement ref=″given″/>
</xsall>
</xscomplexType></xselement>;模式定義的全局元素<xselement name=″family″type=″xsstring″/>;模式定義的全局元素<xselement name=″given″type=″xsstring″/>;模式定義的全局元素<xselement name=″email″type=″xsstring″/>;模式定義的全局元素<xselement name=″url″>;模式定義的復雜類型<xscomplexType>
<xsattribute name=″href″type=″xsstring″default=″http//″/>
</xscomplexType>
</xselement></xsschema>
模式四address.xsd<?xml version=″1.0″encoding=″UTF-8″?><xsschema targetNamespace=″http//org.xmldb.address″xmlnsxs=″http//www.w3.org/2001/XMLSchema″xmlns=″http//org.xmldb.address″elementFormDefault=″qualified″attributeFormDefault=″unqualified″>
<xseltment name=″address″>
<xsannotation>
<xsdocumentation>Comment describing your root element</xsdocumentation>
</xsannotation>
<xscomplexType>
<xssequence>
<xselement name=″tel″type=″xsstring″/>
<xselement name=″postcode″type=″xsstring″/>
<xselement name=″street″ type=″xsstring″/>
</xssequence>
</xscomplexType>
</xselement></xsschema>
首先,建立數(shù)據(jù)庫系統(tǒng)表文檔實例表(docInstance)、文檔集合表(collection)、復雜類型表(complexType)、模式表(schema)、模式引用關系表(schemacrossref)和全局元素表(docRoot)。
Schemacrossref,用于存放可擴展標記語言文件模式間的依賴關系,包括字段名稱空間(namespace)和名稱空間引用(refednamespace);Schema,用于存放可擴展標記語言文件模式與其對應的映射文件的對應關系,包括字段名稱空間(namespace)、名字(name)、模式內容(text)和映射文件名(mapping);DocInstance,用于存放可擴展標記語言文件存儲標識,包括字段文檔實例標識(id)、名字(name)、文檔集合表外鍵(collectionId(FK))和文檔原始內容(text);complexType,用于記錄數(shù)據(jù)庫導入的模式所生成的數(shù)據(jù)庫表(id為生成的表名),包括字段復雜類型標識(id)、名字(name)、名稱空間表外鍵(namespace(FK))和類型(type);docRoot,用于保存數(shù)據(jù)庫導入的模式所定義的全局元素,包括字段全局元素標識(id)、名字(name)和名稱空間(namespace(FK));Collection,用于存放一類xml文件的集合,包括字段文件標識(id)、名字(name)和全局元素表外鍵(docrootid(FK))。
然后,使用通用的解析器將schema作為普通的xml文件進行解析,分析其中的xsimport元素,將xml schema間的依賴(import)關系存入數(shù)據(jù)庫系統(tǒng)表Schemacrossref中。在導入某個具體的模式時,由于其可能依賴其它的模式,如果這些依賴的模式沒有導入到schemacrossref中,則將其一并導入。
如圖5所示,上述四個模式的依賴關系為company.xsd和government.xsd均依賴personal.xsd,personal.xsd依賴address.xsd。
導入government.xsd后表Schemacrossref的存儲結果為

然后導入company.xsd后表Schemacrossref的存儲結果為

下面本例采用schema解析器,例如apach xerces,獲取符合w3c規(guī)范的schema對象模型,再根據(jù)schema對象模型獲取其所引用的名稱空間,本例中company.xsd所獲得的schema對象所引用的名稱空間有三個,分別是http//org.xmldb.companyhttp//org.xmldb.personnelhttp//org.xmldb.address再為每一個名稱空間創(chuàng)建一個映射文件,分別是mapping-company.xml、mapping-personal.xml和mapping-address.xml。本例將模式與映射文件的對應關系存放在數(shù)據(jù)庫系統(tǒng)表schema中,存儲后表schema結果為

下面描述模式三personal.xsd生成映射文件mapping-personal.xml的過程。
在該過程之前先采用下述方法對personal.xsd中的類型和元素進行命名將全局元素命名為“{element}{+目標名稱空間+}+元素的名稱屬性值”;將全局復雜類型命名為“{type}{+目標名稱空間+}+復雜類型的名稱屬性值”;將局部元素命名為“包含該局部元素的復雜類型的全局名字+“/”+該局部元素的名稱屬性值”;將局部復雜類型命名為該局部復雜類型的父元素的全局名字;將簡單類型命名為其基礎類型的全局名字。
故該模式定義的所有全局元素及其全局名字如下personnel{element}{http//org.xmldb.personnel}personelperson{element}{http//org.xmldb.personnel}personname{element}{http//org.xmldb.personnel}namefamily{element}{http//org.xmldb.personnel}familygiven{element}{http//org.xmldb.personnel}givenemail{element}{http//org.xmldb.personnel}emailurl{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該模式的元素和類型有了全局名字后,即能夠區(qū)分不同的類型和元素,映射文件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節(jié)點并設置其相應的屬性。再生成XmlMappingElements節(jié)點,該節(jié)點包含所有生成的XmlMappingElement節(jié)點。本例為;xml元素集合節(jié)點<XmlMappingElements>;全局元素person<XmlMappingElementname=″{element}{http//org.xmldb.personnel}person″localName=″person″elementType=″complex″type=″{element}{http//org.xmldb.personnel}person″id=″F8522164_DC8A_498E_888E_D7ACF6291D39″/>;全局元素personnel<XmlMappingElementname=″{element}{http//org.xmldb.personnel}personnel″localName=″personnel″elementType=″complex″type=″{element}{http//org.xmldb.personnel}personnel″id=″DB1D8AEA_A320_4203_BC3F_B2FE7D4AE326″/>;全局元素url<XmlMappingElementname=″{element}{http//org.xmldb.personnel}url″localName=″url″elementType=″complex″type=″{element}{http//org.xmldb.personnel}url″id=″2E1E9830_AB88_4DC8_8B72_A3DE735CA329″/>;全局元素family<XmlMappingElementname=″{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<XmlMappingElementname=″{element}{http//org.xmldb.personnel}name″localName=″name″elementType=″complex″type=″{element}{http//org.xmldb.personnel}name″id=″5F8ECF2E_82E5_48E7_BD5D_C21FAC8CC297″/>;全局元素given<XmlMappingElementname=″{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<XmlMappingElementname=″{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節(jié)點并設置相應屬性,還要找出每一個復雜類型所包含的所有子元素(包括屬性)。對每一個子元素生成XmlMappingElement節(jié)點,并將其放入其所屬的復雜類型的XmlMappingType節(jié)點中。再生成XmlMappingTypes節(jié)點,該節(jié)點包含所有生成的XmlMappingType節(jié)點。
Personal.xsd生成的映射文件中XmlMappingTypes和XmlMappingType為;xml類型集合節(jié)點<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<XmlMappingElementname=″{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=″{type}{http//www.w3.org/2001/XMLSchema}ID″id=″81195F3E_ED21_44C6_AOD5_F4FOE44BC159″/>;子元素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=″{type}{http//www.w3.org/2001/XMLSchema}string″id=″11C9845E_B1BF_4BFC_A1D0_CD6D89F50F41″/>;子元素salary<XmlMappingElement name=″salary″localName=″salary″elementType=″attribute″type=″{type}{http//www.w3.org/2001/MLSchema}integer″id=″34009506_9DC1_4468_A654_E66BFFE49FCD″/>;子元素name<XmlMappingElementname=″{element}{http//org.xmldb.personnel}name″localName=″name″elementType=″complex″
type=″{element}{http//org.xmldb.personnel}name″id=″5F8ECF2E_82E5_48E7_BD5D_C21FAC8CC297″/>;子元素email<XmlMappingElementname=″{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<XmlMappingElementname=″{element}{http//org.xmldb.personnel}url″localName=″url″elementType=″complex″type=″{element}{http//org.xmldb.personnel}url″id=″2E1E9830_AB88_4DC8_8B72_A3DE735CA329″/>;子元素addresses<XmlMappingElementname=″{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<XmMappingElementname=″{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<XmlMappingElementname=″{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<XmlMappingElementname=″{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>
下面根據(jù)映射文件mapping-personal.xml生成關系數(shù)據(jù)庫表。
首先對于mapping-personal.xml中的每一個XmlMappingType生成一張表,為了使表名唯一,本例采用XmlMappingType中的id作為該表的表名;其次將XmlMappingType所包含的所有屬性和出現(xiàn)小于等于一次的簡單類型元素作為該表的字段;再者對于出現(xiàn)不止一次的簡單類型元素生成一張子表,其表名為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的最大出現(xiàn)次數(shù)大于1,故應生成六張表,將生成表的情況存放在數(shù)據(jù)庫系統(tǒng)表complextype中為

其中每張表都包含如下公共字段(其中AB8E7A48_544A_48E3_8E4C_81268F986E10為本例指定的UUID)

對于每張表除了包含上述公共字段外,還包含了schema定義的所屬類型的所有屬性和簡單類型元素的字段。
表94737D4C_F969_48FF_A4A1_823FA8647BAD({element}{http//org.xmldb.personnel}personnel)包含的字段為


表D62E1F94_35CA_4362_BB4E_DC39C58EACA3({element}{http//org.xmldb.personnel}person)包含的字段為

表CAAAF143_2956_454D_8AF3_8E59F56BBA4E({element}{http//org.xmldb personnel}person/email)包含的字段為

表45E5901B_C36F_4F9E_8888_ADB29B816770({element}{http//org.xmldb.personnel}name)包含的字段為

表22F2B421_815E_4E95_9D49_C67FA72D5265({element}{http//org.xmldb.personnel}url)包含的字段為


表3E043791_8941_471A_A95D_A3DC796BBD5C({element}{http//org.xmldb.personnel}person/addresses)包含的字段為

同理,根據(jù)映射文件mapping-address.xml,address.xsd中的全局元素address生成的表為表35CE114E_D191_4534_A321_9BA88F9CB0BF

下面以實例personal.xml為例來描述將元素值存入關系數(shù)據(jù)庫表的過程。
實例Personal.xml為<?xml version=″1.0″encoding=″UTF-8″?>;名稱空間為http//org.xmldb.personnel<personnel xmlns=http//org.xmldb.personnel xmlnsxsi=″http//www.w3.org/2001/XMLSchema-instance″xsischemaLocation=″http//org.xmldb.personnel personal.xsd″xmlnsaddr=″http//org.xmldb.address″><person id=″id1″salary=″500″>
<name>
<family>張</family>
<giyen>三</given>
</name>
<email>a@a.com</email>
<addresses>
<addraddress>
<addrtel>1234567</addrtel>
<addrpostcode>100005</addrpostcode>
<addrstreet>科學院</addrstreet>
</addraddress>
</addresses></person><person id=″id2″salary=″500″>
<name>
<family>李</family>
<given>四</given>
</name>
<email>b@b.com</email>
<email>c@c.com</email>
<addresses>
<addraddress>
<addrtel>789898</addrtel>
<addrpostcode>100006</addrpostcode>
<addrstreet>北京大學</addrstreet>
</addraddress>
</addresses>
</person></personnel>
首先,解析可擴展標記語言文件以獲得文檔對象模型(dom樹);其次,遞歸處理dom樹的各層節(jié)點及節(jié)點的屬性,并對每一個節(jié)點重復下述過程利用mapping文件找到該節(jié)點的“elementType”和“type”,若elementType為簡單類型(simple)且出現(xiàn)次數(shù)小于等于一,將該節(jié)點值插入父節(jié)點表中的對應字段,若elementType為簡單類型(simple)且出現(xiàn)次數(shù)不止一次,將節(jié)點值插入該節(jié)點對應的表中;若elementType為復雜類型(complex),將節(jié)點值插入該節(jié)點的復雜類型元素所對應的表中,同時分析節(jié)點的屬性,將所有屬性值插入表中對應字段。
將符合personal.xsd定義的xml實例文檔personal.xml存儲在關系數(shù)據(jù)庫表中的結果為(為方便起見,在本文中將公共字段的“AB8E7A48_544A_48E3_8E4C_81268F986E10”省略,只保留“_”,同時由于所有此文檔相關記錄的字段“AB8E7A48_544A_48E3_8E4C_81268F986E10_INSTANCEID”值相同,這里不予列出)表94737D4C_F969_48FF_A4A1_823FA8647BAD({element}{http//org.xmldb.personnel}personnel)存儲結果為

表D62E1F94_35CA_4362_BB4E_DC39C58EACA3({element}{http//org.xmldb.personnel}person)存儲結果為

表CAAAF143_2956_454D_8AF3_8E59F56BBA4E({element}{http//org.xmldb.personnel}person/email)存儲結果為

表45E5901B_C36F_4F9E_8888_ADB29B816770({element}{hRp//org.xmldb.personnel}name)存儲結果為

表22F2B421_815E_4E95_9D49_C67FA72D5265({element}{http//org.xmldb.personnel}url)的記錄為空。
表3E043791_8941_471A_A95D_A3DC796BBD5C({element}{http//org.xmldb.personnel}person/addresses)的存儲結果為

表35CE114E_D191_4534_A321_9BA88F9CB0BF({element}{http//org.xmldb.address}address)存儲結果為

上述所有關系數(shù)據(jù)庫表中省略了相同的公共字段“docInstanceId”,在實際使用中,在每條記錄中加入了personal.xml的文檔實例標識(docInstanceId)值,以表明這些記錄所描述的節(jié)點同屬此文件一personal.xml。
通過上面描述已將personal.xml文件存入關系數(shù)據(jù)庫表中,下面以此文件為例來詳述本發(fā)明可擴展標記語言文件導出方法的技術方案。
如圖1所示,可擴展標記語言文件導出方法包括下述步驟1)獲取可擴展標記語言文件所屬的可擴展標記語言文件模式;2)根據(jù)模式所定義的名稱空間從模式表(schema)中讀出可擴展標記語言文件的映射文件(mapping),所述模式表至少包括名稱空間和映射文件兩個字段;3)根據(jù)映射文件找到存儲該文檔的所有復雜類型和出現(xiàn)不止一次得簡單類型元素的數(shù)據(jù)庫表;4)根據(jù)可擴展標記語言文件的文檔實例標識從所述數(shù)據(jù)庫表中讀取屬于該文件的記錄,以及根據(jù)映射文件構造該文件的文檔對象模型(dom樹);5)將dom樹序列化成字符串以形成可擴展標記語言文件。
如圖2所示,所述步驟1)又進一步細分為下述步驟10)獲取可擴展標記語言文件的名稱空間;11)通過名稱空間獲取相應的可擴展標記語言模式并驗證模式的有效性。
如圖3所示,所述步驟2)又細分為下述步驟20)通過名稱空間獲取引用的名稱空間;21)對每一個名稱空間獲取其對應的映射文件(mapping)并組裝成一個完整的映射文件。
如圖4所示,所述步驟4)進一步細分為下述步驟40)根據(jù)可擴展標記語言文件的文檔實例標識從所述數(shù)據(jù)庫表中讀取屬于該文件的記錄;41)根據(jù)記錄中元素的基本信息、父子關系以及元素在文件中出現(xiàn)的順序,依照映射文件構造出與其相應的元素節(jié)點;42)讀取元素記錄中的父節(jié)點信息以構造出該文件的dom樹。
首先,采用通用解析器,例如apache的xerces解析器,得出文件personal.xml所定義的namespace為http//org.xmldb.personnel,根據(jù)此namespace查詢數(shù)據(jù)庫系統(tǒng)表“schema”中的記錄,找出其相應的Schema及其所引用的namespace,用獲得的Schema對xml文件進行驗證,如果驗證通過,說明xml文件是有效的。對每個namespace查詢數(shù)據(jù)庫系統(tǒng)表“schema”中的記錄,找出該namespace的mapping,并將xml元素映射集合(XmlMappingElements)節(jié)點和xml類型映射集合(XmlMappingTypes)節(jié)點的子節(jié)點進行合并,組裝成一個完整的mappingmapping-personal.xml。
其次,根據(jù)mapping-personal.xml找出存儲personal.xml的所有復雜類型和重復的簡單元素的表。mapping-personal.xml中XmlMappingTypes節(jié)點定義了的如下七個XmlMappingType節(jié)點{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{element}{http//org.xmldb.personnel}person/email{element}{http//org.xmldb.address}address根據(jù)這些XmlMappingType節(jié)點的id屬性值找到相關的數(shù)據(jù)庫表(所有復雜類型和重復的簡單元素的表)94737D4C_F969_48FF_A4A1_823FA8647BADD62E1F94_35CA_4362_BB4E_DC39C58EACA3CAAAF143_2956_454D_8AF3_8E59F56BBA4E45E5901B_C36F_4F9E_8888_ADB29B81677022F2B421_815E_4E95_9D49_C67FA72D52653E043791_8941_471A_A95D_A3DC796BBD5C35CE114E_D191_4534_A321_9BA88F9CB0BF然后利用personal.xml文件的文檔實例標識(docInstacedId)從上述七個表中提取所有屬于該文檔的相關記錄,在這些記錄中按照元素在文檔中的出現(xiàn)次序,也就是表中的字段_ORDER所對應的值,按照由小到大逐一提取記錄,按照mapping利用W3C(萬維網聯(lián)盟)提供的標準DOM的API(ApplicationProgramm Interface,應用程序接口)構造相應記錄的元素節(jié)點??偣?2條記錄,根據(jù)_ORDER字段從小到大構造出的元素節(jié)點分別為a.<personnel></personnel>
b.<person id=”id1”salary=”500”></person>
c.<name><family>張</family><given>三</given></name>
d.<email>a@a.com</email>
e.<addresses></addresses>
f.<address><addrtel>1234567</addrtel><addrpostcode>100005</addrpostcode><addrstreet>科學院</addrstreet></address>
g.<person id=”id2”salary=”500”></person>
h.<name><family>李</family><given>四</given></name>
i.<email>b@b.com</email>
j.<email>c@c.Com</email>
k.<addresses></addresses>
l.<address><addrtel>789898</addrtel><addrpostcode>100006</addrpostcode><addrstreet>北京大學</addrstreet></address>
再者,讀取元素記錄中的父節(jié)點信息構造出文檔的dom樹。
元素節(jié)點a的父節(jié)點是null表明沒有父節(jié)點,元素節(jié)點b的父節(jié)點是元素節(jié)點a,因此放入節(jié)點a,dom樹結果為<personnel>
<person id=”id1”salary=”500”></person>
</personnel>
元素節(jié)點c的父節(jié)點是元素節(jié)點b,加入dom樹,結果為<personnel>
<person id=”id1”salary=”500”>
<name><family>張</family><giyen>三</given></name>
</person>
</personnel>
元素節(jié)點d的父節(jié)點是元素節(jié)點b,加入dom樹,結果為<personnel>
<person id=”id1”salary=”500”>
<name><family>張</family><given>三</given></name>
</person>
<email>a@a.com</email>
</personnel>
以此類推,將后面的節(jié)點分別加入相應的父節(jié)點中。
最后,用標準DOM的API將dom樹序列化成字符串以形成xml文件。
return.xml是將存儲在關系數(shù)據(jù)庫表中的personal.xml導出的結果,retum.xml通過了Schema驗證,并未損失任何可解析的信息,結果如下
return.xml<?xml version=″1.0″encoding=″UTF-8″?><personnel xmlns=http//org.xmldb.personnelxmlnsxsi=″http//www.w3.org/2001/XMLSchema-instance″xsischemaLocation=″http//org.xmldb.personnel personal.xsd″xmlnsaddr=″http//org.xmldb.address″>
<person id=″id1″salary=″500″>
<name>
<family>張</family>
<given>三</given>
</name>
<email>a@a.com</email>
<addresses>
<addraddress>
<addrtel>1234567</addrtel>
<addrpostcode>100005</addrpostcode>
<addrstreet>科學院</addrstreet>
</addraddress>
</addresses></person><person id=″id2″salary=″500″>
<name>
<family>李</family>
<given>四</giyen>
</name>
<email>b@b.com</email>
<email>c@c.com</email>
<addresses>
<addraddress>
<addrtel>789898</addrtel>
<addrpostcode>100006</addrpostcode>
<addrstreet>北京大學</addrstreet>
</addraddress>
</addresses></person>
以上所述僅是本發(fā)明可擴展標記語言文件導出方法的優(yōu)進實施方式,應當指出,對于本技術領域的普通技術人員來說,在不脫離本發(fā)明可擴展標記語言文件導出方法原理的前提下,還可以作出若干改進和潤飾,這些改進和潤飾也應視為本發(fā)明可擴展標記語言文件導出方法的保護范圍。
權利要求
1.一種可擴展標記語言文件導出方法,其特征在于,包括下述步驟1)獲取可擴展標記語言文件所屬的可擴展標記語言文件模式;2)根據(jù)模式所定義的名稱空間從模式表中讀出可擴展標記語言文件的映射文件,所述模式表至少包括名稱空間和映射文件兩個字段;3)根據(jù)映射文件找到存儲該文檔的所有復雜類型和出現(xiàn)不止一次的簡單類型元素的數(shù)據(jù)庫表;4)根據(jù)可擴展標記語言文件的文檔實例標識從所述數(shù)據(jù)庫表中讀取屬于該文件的記錄,以及根據(jù)映射文件構造該文件的文檔對象模型;5)將文檔對象模型序列化成字符串以形成可擴展標記語言文件。
2.如權利要求1所述的可擴展標記語言文件導出方法,其特征在于,所述步驟1)又進一步細分為下述步驟10)獲取可擴展標記語言文件的名稱空間;11)通過名稱空間獲取相應的可擴展標記語言模式并驗證模式的有效性。
3.如權利要求2所述的可擴展標記語言文件導出方法,其特征在于,所述步驟2)又細分為下述步驟20)通過名稱空間獲取引用的名稱空間;21)對每一個名稱空間獲取其對應的映射文件并組裝成一個完整的映射文件。
4.如權利要求3所述的可擴展標記語言文件導出方法,其特征在于,所述步驟4)進一步細分為下述步驟40)根據(jù)可擴展標記語言文件的文檔實例標識從所述數(shù)據(jù)庫表中讀取屬于該文件的記錄;41)根據(jù)記錄中元素的基本信息、父子關系以及元素在文件中出現(xiàn)的順序,依照映射文件構造出與其相應的元素節(jié)點;42)讀取元素記錄中的父節(jié)點信息以構造出該文件的文檔對象模型。
全文摘要
本發(fā)明公開了一種可擴展標記語言文件導出方法,包括步驟獲取可擴展標記語言文件所屬的可擴展標記語言文件模式;根據(jù)模式所定義的名稱空間從模式表中讀出可擴展標記語言文件的映射文件;根據(jù)映射文件找到存儲該文檔的所有復雜類型和出現(xiàn)不止一次的簡單類型元素的數(shù)據(jù)庫表;根據(jù)可擴展標記語言文件的文檔實例標識從所述數(shù)據(jù)庫表中讀取屬于該文件的記錄,以及根據(jù)映射文件構造該文件的文檔對象模型;將文檔對象模型序列化成字符串以形成可擴展標記語言文件。采用本發(fā)明可擴展標記語言文件導出方法能夠在不缺失任何可解析信息的情況下將存儲在關系數(shù)據(jù)庫表中的可擴展標記語言文件導出。
文檔編號G06F17/30GK1632796SQ20041010275
公開日2005年6月29日 申請日期2004年12月27日 優(yōu)先權日2004年12月27日
發(fā)明者李安渝, 嚴兵, 傅朝霞, 秦良娟, 丁蔚, 耿建光, 秦懷平, 董勝濤 申請人:中國科學院軟件研究所, 神州數(shù)碼軟件有限公司
網友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
东阳市| 绥阳县| 高雄市| 耿马| 阜城县| 友谊县| 揭西县| 灵武市| 浦东新区| 建湖县| 湘乡市| 临朐县| 临武县| 永修县| 兴义市| 游戏| 乐都县| 日土县| 吴旗县| 百色市| 河源市| 勐海县| 邹城市| 壤塘县| 北辰区| 金湖县| 化隆| 龙游县| 宁陕县| 南开区| 淳化县| 廉江市| 当涂县| 辽阳市| 九江县| 容城县| 扎赉特旗| 泰宁县| 荣昌县| 扬中市| 谢通门县|