Presentation is loading. Please wait.

Presentation is loading. Please wait.

第11章 XML Schema Object Model物件模型

Similar presentations


Presentation on theme: "第11章 XML Schema Object Model物件模型"— Presentation transcript:

1 第11章 XML Schema Object Model物件模型

2 11-1 Schema Object Model物件模型
SOM的基礎 SOM與XML Schema 為什麼需要使用SOM SOM的介面物件

3 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文件的資訊。

4 SOM與XML Schema 在將XML Schema文件載入Schema Cache後,我們就可以取得指定的XML Schema,然後使用SOM提供的介面物件從Schema文件的根元素開始,存取各Schema元素的內容。 在XML Schema文件最上層包含名稱空間的宣告和Schema元素的定義,然後是element元素的宣告,包含第二層complexType元素的宣告,此時我們可以使用SOM介面物件,由上而下一層一層的瀏覽XML Scheama的元素,然後取出所需的資訊。

5 為什麼需要使用SOM SOM的目的是取得XML Schema文件的架構或指定XML元素的資料型態,不只如此,SOM還可以從XML Schema建立自訂的文件架構。 不同於DOM,SOM瀏覽XML Schema文件的方式和DOM有些不同,DOM是直接剖析XML文件成樹狀的節點結構,而SOM則是取得XML Schema在編譯後的架構,以元素的繼承關係來取得各元素,其架構並不同於原來XML Schema文件的架構。

6 SOM的介面物件

7 11-2 載入XML Schema文件 載入XML Schema文件 XML DOM與SOM 取得Schema文件下一層的元素

8 載入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文件時,就需要指定此名稱。

9 載入XML Schema文件-2 當XML Schema文件載入Schema Cache後,我們可以使用getSchema文件取得指定的Schema文件, Set objSchema = objSchemaCache.getSchema("") 上述方法的參數就是前面指定的URI,在取得ISchema介面物件後,可以使用SOM介面取得Schema文件的元素。

10 載入XML Schema文件-3 例如:使用ISchema介面物件的elements屬性取得所有element元素的ISchemaItemCollection介面物件,如下所示: For Each objEle in objSchema.elements ' 元素名稱 result = result & "名稱: " & objEle.name & " - " ' 取得元素的資料型態 set objType = objEle.type ……... Next

11 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。

12 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元素使用資料型態的相關資訊。

13 取得Schema文件下一層的元素-1 因為XML Schema文件的element元素可能擁有complexType的子元素,而且complexType元素可以擁有element的子元素,SOM的介面物件可以對應Schema元素,同樣也提供相關屬性,可以瀏覽其子元素,使用的是IShemaItem和ISchemaItemCollection介面物件。

14 取得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

15 取得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>"

16 取得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>

17 11-3 顯示XML Schema的元素 處理element元素 處理complexType元素 處理simpleType元素
ISchemaType介面的資料型態 ISchemaModelGroup介面的Indicators元素

18 處理element元素-1 Schema的element元素是ISchemaElement介面物件,因為ISchemaElement是繼承自ISchemaItem,所以可以使用其id屬性取得Schema元素的id屬性值和name屬性的元素名稱。

19 處理element元素-2 ISchemaElement介面物件的相關屬性,如下表所示:

20 處理element元素-3 因為ISchemaElement介面物件是繼承自ISchemaParticle介面物件,所以可以使用下表的兩個屬性取得element元素的屬性值,如下表所示:

21 處理complexType元素 Schema的complexType元素是ISchemaComplexType介面物件,其相關的屬性,如下表所示:

22 處理simpleType元素-1 simpleType元素並沒有對應的SOM介面物件,顯示simpleType元素的資訊,就是使用ISchemaType介面物件的屬性。 我們可以使用baseTypes屬性檢查這是單一基本資料型態或多資料型態的simpleType,也就是restriction/extension元素的base屬性。

23 處理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

24 ISchemaType介面的資料型態-1

25 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

26 ISchemaType介面的資料型態-3 正規語言使用的是patterns屬性,如下所示:
If objType.patterns.length <> 0 Then For Each oPattern in objType.patterns output = output & "pattern屬性: " & oPattern & "<BR>" Next End If 上述程式碼使用For迴路顯示正規語言的範本字串。

27 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

28 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元素: "

29 11-4 顯示XML Schema的屬性-1 在處理XML Schema元素後,接下來我們可以處理元素的屬性,也就是ISchemaAttribute介面物件,只需使用下表的attributes屬性,就可以取得ISchemaItemCollection介面物件集合,如下表所示:

30 11-4 顯示XML Schema的屬性-2 然後使用ISchemaAttribute介面物件屬性取得屬性資料,其相關屬性,如下表所示:


Download ppt "第11章 XML Schema Object Model物件模型"

Similar presentations


Ads by Google