確保XML文檔有效的主要目標之一是減少由XML文檔中不正確的標籤或數據類型引起的錯誤數量。如前所述,不能處理有錯誤的XML文檔。
XML DTD
XML文檔類型定義 (DTD) 定義了XML文檔的結構以及合法元素和屬性。它包含或指向為一類文檔提供語法的標記聲明。DTD可以指向包含標記聲明的外部實體,也可以直接在內部實體中包含標記聲明,或者兩者都包含。在此上下文中,標記聲明是元素類型聲明、屬性列表聲明、實體聲明或符號聲明。基本上,這些聲明定義了特定XML文檔中允許使用哪些元素(即標籤)以及它們可以採用哪些值。
下例將上篇第一個示例中的XML文檔擴展為指向外部XML DTD文檔。
本示例中的DTD以 <!DOCTYPE 開頭,後跟文件路徑。在示例中,預期文件vpn.dtd與原始XML文檔位於同一文件夾中。DTD文檔應包括所有標籤,這些標籤的數據類型應與驗證的XML文檔中預期的數據類型相同。下例顯示了此類DTD文件的外觀。本文檔的第一行定義了驗證文檔的根元素。在之前示例中,根元素有一個 <vpn> 標籤;因此,!DOCTYPE 也具有值vpn。以下以 !ELEMENT 開頭的條目定義了原始XML文檔中標籤的內容:
術語PCDATA歷史上源自術語解析字符數據,可以是任何類型的輸入數據。
!ATTLIST命令定義了另一種條目類型,它驗證附加到某個標籤的屬性。
它確保元素vpn正好有兩個子元素:customer和contact。它確保每個子項(customer和contact)都有某種文本信息,包括零字符串(用於沒有輸入時)。正如本節前面提到的,DTD可能位於單獨的文件中,也可能是初始XML文檔的一部分。帶有DTD的聯合XML文檔如下例所示。除了顯示聯合的XML和DTD文檔之外,上例還強調了XML DTD的附加功能,即在DTD部分定義一些信息(可能是固定的),這些信息可以插入到原始XML文檔中。此信息在XML DTD中定義,帶有!ENTITY條目,後跟名稱「value」結構。之後,在!ENTITY條目中定義的名稱在XML文檔中使用帶有&前綴的名稱調用。在上例中,實體的名稱是fixed_info,因此使用&fixed_info調用它。XML DTD是第一個執行XML文檔驗證的機制。但是,DTD有幾個缺點,包括:為了克服這些缺點,創建了一種新的XML驗證方法:XML模式定義 (XSD)。今天,XSD 比DTD使用得更頻繁。XSD是用XML編寫的,它遵循前面描述的XML語法規則。因為它用於驗證XML對象,所以XSD有一組預定義的標籤,您可以使用它們來創建模式。下例顯示了本章前面的一個XML文檔,準備被XSD驗證。xmlns="http://network.programmability/xmldocs/namespace 1":這是此XML文檔中使用的默認命名空間。
xmlns:xsi="http://www .w3.org/2001/XMLSchema-instance":這是與定義所使用的元素和數據類型的XML模式相關的命名空間。
xsi:schemaLocation="http://network.programmability/xmldocs/namespace 1 vpn.xsd":這是xmlns:xsi XML命名空間之外的屬性,它將原始XML文檔的命名空間指向用於驗證文檔的XML模式的路徑,格式為namespace_name schema_path。
創建XML模式本身的頭之後,就可以開始處理實際內容了。XML模式定義在內容和結構驗證方面提供了廣泛的功能,您將逐漸了解它們,從而能夠創建XSD,XSD可以驗證先前創建的文檔。XSD的基本構建塊是一個元素,如下例所示。
在示例中,您可以看到從原始XML文檔中提取的兩個鍵/值對,後跟兩個字符串,顯示了如何在XSD中尋址這些元素。在XSD中,描述XML條目的標籤是 <element>,並且通常以與命名空間關聯的前綴(在本例為 <xs:element>)作為前綴。您可能已經注意到,<xs:element> 是一個空條目標籤,這意味著它沒有任何值。這個標籤有兩個相關的屬性:
XSD有一長串預定義數據類型,您可以在XSD模式中引用它們。下表總結了最廣泛使用的XSD數據類型。您可能希望將許多其它屬性添加到XSD架構中。XSD驗證必須有兩個屬性:default:如果未提供值,則此屬性將默認值設置為已驗證的標記。fixed:該屬性重寫驗證標籤的值,即使沒有提供值。有時您需要向XML文檔添加更嚴格的驗證,例如不僅針對特定數據類型而且針對可能的值進行驗證。例如,在之前示例,您可能會注意到條目 <router> 具有終止客戶服務的路由器的主機名。儘管路由器的主機名是任意值,但您應該將服務與現有路由器相關聯。因此,您需要在XML文檔中提供有效路由器的主機名,並確保XML模式可以驗證它。通常,具有單個標籤和單個值的元素稱為簡單對象,並且XSD文檔中通常不會提及簡單對象,除非您需要施加進一步的限制,例如內容驗證。假設您有一個包含四個路由器的網絡,稱為FRA-1、DUS-1、BLN-1和MNC-1。在XSD文檔中,您可以添加 <router> 條目的驗證,如下例所示。
標籤 <xs:simpleType> 定義驗證的條目是一個簡單的對象。標籤 <xs:restriction> 提供了驗證標籤值的機制,它有一個單一的屬性庫來標識要驗證的數據類型。您可能會注意到,該屬性不再稱為類型,就像之前示例那樣。<xs:restriction> 中嵌套的所有標籤都是驗證規則。在上例中,規則有一個枚舉類型,它是允許值的下拉列表。需要單獨提供所有可能的值;每個值都有自己的條目。內容驗證有多種選擇。其中之一,基於Linux正則表達式,由於其高效率而被廣泛使用。下例顯示了這樣一個選項。示例中的驗證規則稱為 <pattern>,它驗證條目的值是否與屬性 <value> 中提供的所需正則表達式匹配。在示例中,所需的模式是包含大寫和小寫字母、數字和字符(例如 .、- 和 _)的字符集,後跟 @ 字符,然後是相同的字符集。@之前和之後都應該至少有一個字符。這是郵箱的標準格式,您可能希望實施此類檢查以避免在以錯誤格式提供客戶聯繫信息時出現問題。您可以修改示例以使其更複雜並適合您的需要。
儘管模式驗證也適用於數字數據(例如,整數、十進位),但您可能希望添加特定於數字的驗證規則。以下兩條規則是最常用的:
除了驗證條目值之外,您可能還需要驗證條目屬性。為此,您使用另一個XSD標籤 <attribute>,它與名稱空間前綴一起產生 <xs:attribute>。這是一個類似於 <xs:element> 的空條目標籤,如下例所示。
標籤 <xs:attribute> 中的必需屬性的名稱和類型與標籤 <xs:element> 相同,但您可以在示例中看到另一個可選屬性:use。本質上,屬性在XML文檔中不是強制性的。因此,如果一個屬性根據應用程式的邏輯是強制性的,您應該在XSD模式中提及它。
示例有一個缺點:它沒有顯示屬性與原始標籤的關係。原因是帶有屬性的標籤不是像目前介紹的那樣簡單的對象。它是一個複雜的對象。
XML 模式中有四種類型的複雜元素:
空元素
僅包含其它元素的元素
僅包含一些文本的元素
包含混合信息的元素
第一種類型如例所示,它為只有屬性而沒有任何文本數據的元素提供驗證。用於驗證的正確XSD看起來如下所示。
您可以在示例中看到條目 <xs:element> 具有另一個嵌套條目 <xs:complexType>,該條目又包含與XML文檔中的條目相關的所有驗證。在示例中,它具有單個屬性驗證,它與上個示例中提供的字符串相同。
第二種複雜對象是包含其它元素的元素。有兩種方法可以使用這樣的元素:將 <complexType> 條目直接添加到對象或創建一個命名的 <complexType> 並在經過驗證的元素中按其名稱調用它。顯然,第二種選擇更具可擴展性。為了強調這一點,請查看本篇第4個示例中的驗證對象。可以看到元素 <customer_side> 和 <provider_side> 具有相同的內部內容;因此,您可以利用 <complexType> 的命名對象,如下例所示。
示例包含元素 <xs:complexType>,它是作為獨立條目創建的,其屬性名稱值為「connectivity_info」。在該元素內是另一個嵌套元素 <xs:sequence>,它包含以與之前為簡單對象所做的相同形式提供的驗證元素。注意, <xs:sequence> 要求經過驗證的元素以定義的順序出現,而不是隨機出現。
創建命名的複雜對象後,您可以在驗證具有進一步嵌套的元素時使用它。正如您在示例中看到的那樣,這是通過在需要驗證的元素中使用 type="connectivity_info" 來完成的。
儘管命名複雜類型元素非常有用,但在某些情況下,您可以使用普通的未命名對象來滿足驗證要求。下例通過在樹中再添加一層來擴展前一個示例。
在示例中,<site> 是 <customer_side> 和 <provider_side> 元素的父元素。您可以創建另一個名為 <xs:complexType> 的元素來驗證站點。但是,您還可以通過添加 <xs:sequence> 元素並將所有需要驗證的子元素直接放在那裡來擴展之前示例創建的模式。如果元素的順序不重要,您可以使用 <xs:all> 而不是 <xs:sequence> 來包含所有嵌套檢查。在某些情況下,經過驗證的元素可能具有包含一個或另一個嵌套元素但不能同時包含兩個元素的邏輯。假設 <site> 應該包含 <provider_side> 或 <customer_side> 元素。在這種情況下,模式的元素 <xs:sequence> 應該替換為 <xs:choice>,如下例所示。至此,您應該已經了解了XML模式定義 (XSD),包括構建驗證條目的整體結構和細節。下表突出顯示了DTD和XSD之間的差異。從這個比較中可以看出,今天開發基於XML的數據結構時,應該使用XSD。網絡編程和自動化基礎-41
網絡編程和自動化基礎-40
網絡編程和自動化基礎-39
網絡編程和自動化基礎-38
技術交流群(僅限行業和技術交流,嚴禁廣告,非誠勿擾):