Transcript Document

第11章 XML Schema Object
Model物件模型




11-1
11-2
11-3
11-4
Schema Object Model物件模型
載入XML Schema文件
顯示XML Schema的元素
顯示XML Schema的屬性
11-1 Schema Object Model物件模
型




SOM的基礎
SOM與XML Schema
為什麼需要使用SOM
SOM的介面物件
SOM的基礎


在MSXML 4.0版提供全新「Schema Object
Model」(SOM),這是一組瀏覽物件可以直接存
取W3C XML Schema Definition(XSD)的
Schema文件。
SOM提供一組介面物件存取XML Schema文件
的元素資訊,當使用Schema Cache載入XML
Schema,這個Cache是使用DOM物件的
IXMLDOMSchemaCollection2介面來存取
Schema,在取得Schema,就可以使用SOM物
件存取XML Schema文件的資訊。
SOM與XML Schema


在將XML Schema文件載入Schema Cache後,
我們就可以取得指定的XML Schema,然後使用
SOM提供的介面物件從Schema文件的根元素開
始,存取各Schema元素的內容。
在XML Schema文件最上層包含名稱空間的宣告
和Schema元素的定義,然後是element元素的
宣告,包含第二層complexType元素的宣告,此
時我們可以使用SOM介面物件,由上而下一層一
層的瀏覽XML Scheama的元素,然後取出所需
的資訊。
為什麼需要使用SOM


SOM的目的是取得XML Schema文件的架
構或指定XML元素的資料型態,不只如此,
SOM還可以從XML Schema建立自訂的文
件架構。
不同於DOM,SOM瀏覽XML Schema文
件的方式和DOM有些不同,DOM是直接剖
析XML文件成樹狀的節點結構,而SOM則
是取得XML Schema在編譯後的架構,以
元素的繼承關係來取得各元素,其架構並
不同於原來XML Schema文件的架構。
SOM的介面物件
介面
ISchema
ISchemaAny
ISchemaAttribute
ISchemaAttributeGroup
ISchemaComplexType
ISchemaElement
ISchemaItem
ISchemaItemCollection
ISchemaModelGroup
ISchemaNotation
ISchemaParticle
ISchemaType
說明
取得在 Schema Cache 中,指定 XML Schema 的資訊,在取得
此物件後,我們就可以進一步取得各 Schema 元素的資訊
提供<anyAttribute>元素宣告的相關資訊
提供<attribute>元素宣告的屬性資訊
提供<attributeGroup>元素宣告的相關資訊,主要是取得下一層
<attribute>和<anyAttribute>元素宣告的資訊
提供<complexType>元素宣告的相關資訊,主要是取得下一層
<element>和<attribute>等元素宣告的資訊
提供<element>元素宣告的相關資訊
取得 XML Schema 所有各別元素的資訊
這是 SOM 介面屬性傳回的物件集合,提供方法可以搜尋和瀏
覽物件集合,例如:取得 XML Schema 所有元素、資料型態或
屬性的集合物件
提供結合 ISchemaElement、 IschemaModelGroup 和 ISchemaAny
的物件集合,主要是用來處理<all>、<choice>和<sequence>等
元素的宣告
提供<notation>元素宣告的相關資訊
取得 minOccurs 和 maxOccurs 屬性的內容
提供基本資料型態的資訊
11-2 載入XML Schema文件



載入XML Schema文件
XML DOM與SOM
取得Schema文件下一層的元素
載入XML Schema文件-1
現在筆者使用VBScript語法的ASP程式建立
Schema Cache,如下所示:
Set objSchemaCache =
CreateObject("MSXML2.XMLSchemaCache.
4.0")
 上述程式碼建立Schema Cache,然後我們就可
以使用add方法載入XML Schema文件,如下所
示:
objSchemaCache.add "",
Server.MapPath("Ch11-2.xsd")
 上述方法的第一個參數是名稱空間的URI,如果
需要同時載入擁有名稱空間的Schema文件時,
就需要指定此名稱。

載入XML Schema文件-2

當XML Schema文件載入Schema Cache
後,我們可以使用getSchema文件取得指
定的Schema文件,
Set objSchema =
objSchemaCache.getSchema("")

上述方法的參數就是前面指定的URI,在取
得ISchema介面物件後,可以使用SOM介
面取得Schema文件的元素。
載入XML Schema文件-3
例如:使用ISchema介面物件的elements屬性
取得所有element元素的
ISchemaItemCollection介面物件,如下所示:
For Each objEle in objSchema.elements
' 元素名稱
result = result & "名稱: " & objEle.name &
"-"
' 取得元素的資料型態
set objType = objEle.type
……...
Next

XML DOM與SOM-1
在前面曾經說過SOM主要的目的是配合DOM取得指定元
素的資料型態,在建立Schema Cache物件
objSchemaCache且載入XML Schema文件後,我們就
可以建立DOM物件,如下所示:
Set objxmlDom =
Server.CreateObject("Msxml2.DOMDocument.4.0")
objxmlDom.async = False
Set objxmlDom.schemas = objSchemaCache
objxmlDom.load(Server.MapPath("Ch11-2.xml"))
 上述程式碼在建立DOM物件後,使用schemas屬性指定
使用的Schemas。

XML DOM與SOM-2
在使用load方法載入XML文件後,就可以使用XPath語言
取得指定的節點物件,如下所示:
objxmlDom.setProperty "SelectionLanguage",
"XPath"
Set objNode = objxmlDom.selectSingleNode("//job")
 上述指令指定使用XPath語言,取得所有的job元素(事實
上只有一個),在取得節點元素後,可以取得對應的XML
Schema元素,如下所示:
Set objEle =
objxmlDom.namespaces.getDeclaration(objNode)
 上述程式碼使用getDeclaration方法取得對應的
Schema元素,換句話說,我們可以取得此XML元素使用
資料型態的相關資訊。

取得Schema文件下一層的元素1

因為XML Schema文件的element元素可
能擁有complexType的子元素,而且
complexType元素可以擁有element的子
元素,SOM的介面物件可以對應Schema
元素,同樣也提供相關屬性,可以瀏覽其
子元素,使用的是IShemaItem和
ISchemaItemCollection介面物件。
取得Schema文件下一層的元素2
當我們使用ISchema介面物件的types屬性取得
第一層any、simpleType或complexType元素,
以此例的XML Schema只有complexType元素,
如下所示:
Set objComplexTypes = objSchema.types
For i = 0 To objComplexTypes.length - 1
result=result&"complexType元素名稱: " & _
objComplexTypes(i).name &
"<BR>"
Next

取得Schema文件下一層的元素3

然後使用ISchemaItem介面物件的索引值取得
指定物件,這是ISchemaComplexType介面物
件,可以使用contentModel屬性取得
ISchemaModelGroup介面物件,也就是
complexType元素的子元素,如下所示:
Set objContentModelGroup =
objComplexTypes(0).contentModel
Set objItems = objContentModelGroup.particles
result = result & "第一個元素: " & objItems(0).Name
& "<BR>"
result = result & "第二個元素: " & objItems(1).Name
& "<BR>"
result = result & "第三個元素: " & objItems(2).Name
& "<BR>"
取得Schema文件下一層的元素4
對應到XML Schema的元素,如下所示:
<xs:complexType name="jobType">
<xs:sequence>
<xs:element ref="companyname"/>
<xs:element ref="title"/>
<xs:element ref="description"/>
</xs:sequence>
<xs:attribute name="code" type="xs:ID"
use="required"/>
</xs:complexType>

11-3 顯示XML Schema的元素





處理element元素
處理complexType元素
處理simpleType元素
ISchemaType介面的資料型態
ISchemaModelGroup介面的Indicators
元素
處理element元素-1

Schema的element元素是
ISchemaElement介面物件,因為
ISchemaElement是繼承自
ISchemaItem,所以可以使用其id屬性取
得Schema元素的id屬性值和name屬性的
元素名稱。
處理element元素-2

ISchemaElement介面物件的相關屬性,
如下表所示:
屬性
defaultValue
fixedValue
isAbstract
isNillable
isReference
type
說明
取得元素的預設值
取得元素的固定值
檢查 abstract 屬性值是否為 true
取得 nillable 屬性值
檢查此 element 是否是參考到其它上層的<element>元素
取得元素的資料型態
處理element元素-3

因為ISchemaElement介面物件是繼承自
ISchemaParticle介面物件,所以可以使
用下表的兩個屬性取得element元素的屬
性值,如下表所示:
屬性
maxOccurs
minOccurs
說明
取得最大出現的次數,如果沒有此屬性傳回 0,傳回-1 表示無限
(Unbounded)
取得最小出現的次數,如果沒有此屬性傳回 0
處理complexType元素

Schema的complexType元素是
ISchemaComplexType介面物件,其相
關的屬性,如下表所示:
屬性
anyAttribute
attributes
contentModel
contentType
isAbstract
說明
取得<anyAttribute>元素物件(如果有的話)
取得<attribute>元素宣告的屬性物件集合,取得的就是
ISchemaAttribute 介面物件
取得<complexType>元素下的 ISchemaModelGroup 介面物件,可以
處理子元素<all>、<choice>和<sequence>
取得<complexType>元素的 content-type
檢查 abstract 屬性值是否為 true
處理simpleType元素-1


simpleType元素並沒有對應的SOM介面物
件,顯示simpleType元素的資訊,就是使
用ISchemaType介面物件的屬性。
我們可以使用baseTypes屬性檢查這是單
一基本資料型態或多資料型態的
simpleType,也就是
restriction/extension元素的base屬性。
處理simpleType元素-2
If條件判斷擁有多少基本資料型態,如果不只一個,可以
使用For Each迴路顯示所有的資料型態,如果只有一個,
就是顯示ISchemaType的屬性。
If objType.baseTypes.length > 1 Then
' 多基本資料型態
For Each oType in objType.baseTypes
output = output & "資料型態: " & oType.name
Next
Else
' 單一資料型態
………
End If

ISchemaType介面的資料型態-1
屬性
baseTypes
enumeration
final
fractionDigits
length
maxExclusive
maxInclusive
maxLength
minExclusive
minInclusive
minLength
patterns
totalDigits
variety
whiteSpace
說明
取得 restriction/extension 元素的 base 屬性
取得<enumeration>元素的資訊
取得 final 屬性的值
取得<fractionDigits>元素的資訊
取得<length>元素的資訊
取得<maxExclusive>元素的資訊
取得<maxInclusive>元素的資訊
取得<maxLength>元素的資訊
取得<minExclusive>元素的資訊
取得<minInclusive>元素的資訊
取得<minLength>元素的資訊
取得<pattern>元素的資訊
取得<totalDigits>元素的資訊
取得 variety 屬性的值
取得<whitespace>元素的資訊
ISchemaType介面的資料型態-2
屬性可以取得simpleType的列舉式資料型態和正
規語言的設定,如果使用enumneration屬性取
得物件的length屬性大於0,表示這個
simpleType或complexType屬於一種列舉資料
型態,如下所示:
If objType.enumeration.length > 0 Then
For Each item in objType.enumeration
output = output & "enumeration屬性: "
& item & "<BR>"
Next
End If

ISchemaType介面的資料型態-3
正規語言使用的是patterns屬性,如下所示:
If objType.patterns.length <> 0 Then
For Each oPattern in objType.patterns
output = output & "pattern屬性: " &
oPattern & "<BR>"
Next
End If
 上述程式碼使用For迴路顯示正規語言的範本字串。

ISchemaModelGroup介面的
Indicators元素-1
ISchemaModelGroup介面物件是用來處理all、
choice和sequence等的Indicators元素,使用
ISchemaType介面物件的contentModel屬性可
以取得使用的Indicator元素,如下所示:
Set objIndicator = objType.contentModel
If objIndicator.itemType = SOMITEM_ALL
Then
result = result & "all元素: "
For Each item in objIndicator.particles
result = result & "[" & item.name & "]"
Next
End If

ISchemaModelGroup介面的
Indicators元素-2
If objIndicator.itemType = SOMITEM_CHOICE Then
result = result & "choice元素: "
For Each item in objIndicator.particles
result = result & "[" & item.name & "]"
Next
End If
If objIndicator.itemType = SOMITEM_SEQUENCE
Then
result = result & "sequence元素: "
For Each item in objIndicator.particles
result = result & "[" & item.name & "]"
Next
End If
11-4 顯示XML Schema的屬性-1

在處理XML Schema元素後,接下來我們可以處
理元素的屬性,也就是ISchemaAttribute介面
物件,只需使用下表的attributes屬性,就可以
取得ISchemaItemCollection介面物件集合,
如下表所示:
屬性
ISchema.attributes
ISchemaAttributeGroup.attributes
ISchemaComplexType.attributes
取得 XML Schema 元素
<attribute>
<attribute>
<attribute>
11-4 顯示XML Schema的屬性-2

然後使用ISchemaAttribute介面物件屬性
取得屬性資料,其相關屬性,如下表所示:
屬性
defaultValue
fixedValue
isReference
type
use
說明
取得 default 屬性值
取得 fixed 屬性值
檢查此 attribute 是否是參考到其它上層的<element>元素
取得屬性的資料型態
取得 use 屬性