XML Schema 複雜元素類型詳解:定義及示例解析

来源:https://www.cnblogs.com/xiaowange/p/18199773
-Advertisement-
Play Games

在XML Schema(XSD)中,複雜元素包含其他元素和/或屬性,分為4類:空元素、僅含元素、僅含文本和既含元素也含文本。定義複雜元素可通過直接聲明或引用預定義的複雜類型。複雜空元素僅含屬性,而僅含元素的類型則只包含其他子元素。XSD提供了`<xs:sequence>`、`<xs:all>`、`<... ...


在XML Schema(XSD)中,複雜元素是指包含其他元素和/或屬性的XML元素。複雜元素可以分為四種類型:

  1. 空元素: 僅包含其他元素和/或屬性的元素。
  2. 僅包含其他元素的元素: 不包含文本內容,只包含其他子元素的元素。
  3. 僅包含文本的元素: 不包含其他子元素,只包含文本內容的元素。
  4. 既包含其他元素又包含文本的元素: 同時包含其他子元素和文本內容的元素。

以下是複雜元素的一些示例:

  • 空元素:
<product pid="1345"/>
  • 僅包含其他元素的元素:
<employee>
  <firstname>John</firstname>
  <lastname>Smith</lastname>
</employee>
  • 僅包含文本的元素:
<food type="dessert">Ice cream</food>
  • 既包含其他元素又包含文本的元素:
<description>
It happened on <date lang="norwegian">03.03.99</date> ....
</description>

在XML Schema中,可以通過以下兩種方式定義複雜元素:

  1. 使用<xs:element>元素直接聲明元素,併在其中定義複雜類型。例如:
<xs:element name="employee">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>
  1. 使用<xs:complexType>元素定義複雜類型,然後在需要的地方引用該類型。例如:
<xs:element name="employee" type="personinfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

您還可以基於現有的複雜類型創建新的複雜類型,併在其中添加額外的元素,如上面的第二個示例所示。

<xs:element name="employee" type="fullpersoninfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

<xs:complexType name="fullpersoninfo">
  <xs:complexContent>
    <xs:extension base="personinfo">
      <xs:sequence>
        <xs:element name="address" type="xs:string"/>
        <xs:element name="city" type="xs:string"/>
        <xs:element name="country" type="xs:string"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>

一個空的複雜元素在XML中不包含內容,只能包含屬性。以下是關於XSD中空元素的一些說明和示例:

複雜空元素

一個空的XML元素示例:

<product prodid="1345" />

在上面的示例中,"product"元素沒有任何內容,只有一個名為"prodid"的屬性。

在XSD中定義一個空元素需要遵循以下步驟:

  1. 使用<xs:element>元素定義元素。
  2. 使用<xs:complexType>元素定義複雜類型。
  3. 使用<xs:complexContent>元素指定內容模型。
  4. 使用<xs:restriction>元素基於基本類型(如整數)定義限制。
  5. 使用<xs:attribute>元素定義屬性。

以下是一個定義空元素的XSD示例:

<xs:element name="product">
  <xs:complexType>
    <xs:complexContent>
      <xs:restriction base="xs:integer">
        <xs:attribute name="prodid" type="xs:positiveInteger"/>
      </xs:restriction>
    </xs:complexContent>
  </xs:complexType>
</xs:element>

但是,您也可以更簡潔地定義空元素,如下所示:

<xs:element name="product">
  <xs:complexType>
    <xs:attribute name="prodid" type="xs:positiveInteger"/>
  </xs:complexType>
</xs:element>

或者,您可以給複雜類型指定一個名稱,並將"type"屬性設置為該名稱,如下所示:

<xs:element name="product" type="prodtype"/>

<xs:complexType name="prodtype">
  <xs:attribute name="prodid" type="xs:positiveInteger"/>
</xs:complexType>

僅包含元素的複雜類型

一個"僅包含元素"的複雜類型包含一個只包含其他元素的元素。

例如,以下是一個包含僅包含其他元素的XML元素 "person" 的示例:

<person>
  <firstname>John</firstname>
  <lastname>Smith</lastname>
</person>

您可以使用<xs:sequence>元素在模式中定義 "person" 元素,如下所示:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

在上述示例中,<xs:sequence>元素表示在 "person" 元素內部定義的元素("firstname" 和 "lastname")必須按照該順序出現。

或者,您也可以給複雜類型指定一個名稱,並將"type"屬性設置為該名稱,如下所示:

<xs:element name="person" type="persontype"/>

<xs:complexType name="persontype">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

在上述示例中,我們將複雜類型的名稱設置為"persontype",然後將"type"屬性設置為該名稱,以便多個元素可以引用相同的複雜類型。

註意:為了允許字元數據出現在 "letter" 的子元素之間,必須將 mixed 屬性設置為 "true"。<xs:sequence> 標簽表示定義的元素(name、orderid 和 shipdate)必須以該順序出現在 "letter" 元素內

我們還可以給 complexType 元素一個名稱,並讓 "letter" 元素具有指向 complexType 名稱的 type 屬性(如果使用此方法,多個元素可以引用相同的複雜類型):

<xs:element name="letter" type="lettertype"/>

<xs:complexType name="lettertype" mixed="true">
  <xs:sequence>
    <xs:element name="name" type="xs:string"/>
    <xs:element name="orderid" type="xs:positiveInteger"/>
    <xs:element name="shipdate" type="xs:date"/>
  </xs:sequence>
</xs:complexType>

XSD 指示器
我們可以使用指示器來控制文檔中元素的使用方式。

指示器
有七個指示器:

順序指示器:

  • All
  • Choice
  • Sequence

出現指示器:

  • maxOccurs
  • minOccurs

組指示器:

  • 組名稱
  • 屬性組名稱

順序指示器
順序指示器用於定義元素的順序。

All 指示器
<all> 指示器指定子元素可以以任何順序出現,並且每個子元素只能出現一次:

<xs:element name="person">
  <xs:complexType>
    <xs:all>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:all>
  </xs:complexType>
</xs:element>

註意:在使用 <all> 指示器時,您可以將 <minOccurs> 指示器設置為 0 或 1,並且 <maxOccurs> 指示器只能設置為 1(有關 <minOccurs><maxOccurs> 的說明稍後描述)。

Choice 指示器
<choice> 指示器指定可以出現一個子元素或另一個子元素:

<xs:element name="person">
  <xs:complexType>
    <xs:choice>
      <xs:element name="employee" type="employee"/>
      <xs:element name="member" type="member"/>
    </xs:choice>
  </xs:complexType>
</xs:element>

Sequence 指示器
<sequence> 指示器指定子元素必須以特定順序出現:

<xs:element name="person">
   <xs:complexType>
    <xs:sequence>
      <xs:element name="firstname" type="xs:string"/>
      <xs:element name="lastname" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

出現指示器
出現指示器用於定義元素可以出現的次數。

註意:對於所有的 "順序" 和 "組" 指示器(all、choice、sequence、組名稱和組引用),maxOccurs 和 minOccurs 的預設值為 1。

maxOccurs 指示器
<maxOccurs> 指示器指定元素可以出現的最大次數:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="full_name" type="xs:string"/>
      <xs:element name="child_name" type="xs:string" maxOccurs="10"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

上面的示例指示了在 "person" 元素中,"child_name" 元素可以出現最少一次(minOccurs 的預設值為 1),最多出現十次。

minOccurs 指示器
<minOccurs> 指示器指定元素可以出現的最小次數:

<xs:element name="person">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="full_name" type="xs:string"/>
      <xs:element name="child_name" type="xs:string"
      maxOccurs="10" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

上面的示例指示了在 "person" 元素中,"child_name" 元素可以出現最少零次,最多出現十次。

提示:要允許元素出現無限次數,使用 maxOccurs="unbounded" 語句:

<xs:element name="child_name" type="xs:string" maxOccurs="unbounded"/>

一個工作示例:

名為 Myfamily.xml 的 XML 文件:

<?xml version="1.0" encoding="UTF-8"?>

<persons xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="family.xsd">

<person>
  <full_name>Hege Refsnes</full_name>
  <child_name>Cecilie</child_name>
</person>

<person>
  <full_name>Tove Refsnes</full_name>
  <child_name>Hege</child_name>
  <child_name>Stale</child_name>
  <child_name>Jim</child_name>
  <child_name>Borge</child_name>
</person>

<person>
  <full_name>Stale Refsnes</full_name>
</person>

</persons>

上面的 XML 文件包含一個名為 "persons" 的根元素。在這個根元素內,我們定義了三個 "person" 元素。每個 "person" 元素必須包含一個 "full_name" 元素,最多可以包含五個 "child_name" 元素。

以下是模式文件 family.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">

<xs:element name="persons">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="person" maxOccurs="unbounded">
        <xs:complexType>
          <xs:sequence>
            <xs:element name="full_name" type="xs:string"/>
            <xs:element name="child_name" type="xs:string"
            minOccurs="0" maxOccurs="5"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
</xs:element>

</xs:schema>

組指示器
組指示器用於定義相關的元素集合。

元素組
元素組使用 group 聲明來定義,如下所示:

<xs:group name="groupname">
...
</xs:group>

您必須在組聲明中定義 all、choice 或 sequence 元素。以下示例定義了一個名為 "persongroup" 的組,該組定義了必須以精確順序出現的一組元素:

<xs:group name="persongroup">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="birthday" type="xs:date"/>
  </xs:sequence>
</xs:group>

在定義了組之後,您可以在另一個定義中引用它,如下所示:

<xs:group name="persongroup">
  <xs:sequence>
    <xs:element name="firstname" type="xs:string"/>
    <xs:element name="lastname" type="xs:string"/>
    <xs:element name="birthday" type="xs:date"/>
  </xs:sequence>
</xs:group>

<xs:element name="person" type="personinfo"/>

<xs:complexType name="personinfo">
  <xs:sequence>
    <xs:group ref="persongroup"/>
    <xs:element name="country" type="xs:string"/>
  </xs:sequence>
</xs:complexType>

屬性組

屬性組使用 attributeGroup 聲明來定義,如下所示:

<xs:attributeGroup name="groupname">
...
</xs:attributeGroup>

以下示例定義了一個名為 "personattrgroup" 的屬性組:

<xs:attributeGroup name="personattrgroup">
  <xs:attribute name="firstname" type="xs:string"/>
  <xs:attribute name="lastname" type="xs:string"/>
  <xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>

在定義了屬性組之後,您可以在另一個定義中引用它,如下所示:

<xs:attributeGroup name="personattrgroup">
  <xs:attribute name="firstname" type="xs:string"/>
  <xs:attribute name="lastname" type="xs:string"/>
  <xs:attribute name="birthday" type="xs:date"/>
</xs:attributeGroup>

<xs:element name="person">
  <xs:complexType>
    <xs:attributeGroup ref="personattrgroup"/>
  </xs:complexType>
</xs:element>
<?xml version="1.0" encoding="UTF-8"?>

<person>
  <firstname>Hege</firstname>
  <lastname>Refsnes</lastname>
  <children>
    <childname>Cecilie</childname>
  </children>
</person>

<person>
  <firstname>Stale</firstname>
  <lastname>Refsnes</lastname>
</person>

上述 XML 文件是有效的,因為模式 family.xsd 允許我們在 lastname 元素後面添加一個可選元素。

<any><anyAttribute> 元素用於創建可擴展文檔!它們允許文檔包含未在主 XML 模式中聲明的附加元素。

<xs:element name="name" type="xs:string"/>
<xs:element name="navn" substitutionGroup="name"/>

<xs:complexType name="custinfo">
  <xs:sequence>
    <xs:element ref="name"/>
  </xs:sequence>
</xs:complexType>

<xs:element name="customer" type="custinfo"/>
<xs:element name="kunde" substitutionGroup="customer"/>

根據上述模式,一個有效的 XML 文檔可能如下所示:

<customer>
  <name>John Smith</name>
</customer>

或者像這樣

<kunde>
  <navn>John Smith</navn>
</kunde>

阻止元素替代

要防止其他元素替代指定元素,使用 block 屬性:

<xs:element name="name" type="xs:string" block="substitution"/>

看看這個 XML 模式的片段:

<xs:element name="name" type="xs:string" block="substitution"/>
<xs:element name="navn" substitutionGroup="name"/>

<xs:complexType name="custinfo">
  <xs:sequence>
    <xs:element ref="name"/>
  </xs:sequence>
</xs:complexType>

<xs:element name="customer" type="custinfo" block="substitution"/>
<xs:element name="kunde" substitutionGroup="customer"/>

根據上述模式,一個有效的 XML 文檔看起來像這樣:

<customer>
  <name>John Smith</name>
</customer>

但以下不再有效:

<kunde>
  <navn>John Smith</navn>
</kunde>

使用 substitutionGroup

可替代元素的類型必須與頭元素的類型相同,或者派生自頭元素的類型。如果可替代元素的類型與頭元素的類型相同,則無需指定可替代元素的類型。

請註意,替代組中的所有元素(頭元素和可替代元素)必須聲明為全局元素,否則將無法正常工作!

什麼是全局元素

全局元素是直接作為 "schema" 元素的子元素的元素!局部元素是嵌套在其他元素中的元素。

最後

為了方便其他設備和平臺的小伙伴觀看往期文章:

微信公眾號搜索:Let us Coding,關註後即可獲取最新文章推送

看完如果覺得有幫助,歡迎點贊、收藏、關註


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 粗排/精排的個性化多任務學習模型,能預估20多個不同的預估值,如點擊率、有效播放率、播放時長、點贊率、關註率等,那如何用它來排序呢?從多任務學習到多目標排序,中間有一個過渡,即如何把這些預估值融合成一個單一的排序分,最後實現多目標精排。這也就引入了本文要介紹的正題:多目標融合(multi-task ... ...
  • 通過詳細的查詢 SQL 語句分析,深入挖掘潛在的性能瓶頸,結合資料庫架構、索引優化以及查詢執行計劃等方面,提出針對性的優化建議,以提升查詢性能和系統效率。 ...
  • 一、開發卡片事件 HarmonyOS元服務卡片頁面(Metaservice Card Page)是指在HarmonyOS系統中,用於展示元服務的頁面界面。元服務是指一組提供特定功能或服務的組件,例如天氣服務、音樂播放服務等。元服務卡片頁面可以顯示元服務的相關信息和操作選項,用戶可以通過點擊卡片頁 ...
  • 一、開發卡片頁面 HarmonyOS元服務卡片頁面(Metaservice Card Page)是指在HarmonyOS系統中,用於展示元服務的頁面界面。元服務是指一組提供特定功能或服務的組件,例如天氣服務、音樂播放服務等。元服務卡片頁面可以顯示元服務的相關信息和操作選項,用戶可以通過點擊卡片頁 ...
  • 一、服務卡片的模塊和創建 在HarmonyOS中,服務卡片是一種提供即時信息和快速操作的小組件,類似於Android中的通知欄。服務卡片可以顯示各種類型的信息,包括通知、天氣、日曆事件、音樂播放器、快捷方式等。用戶可以根據自己的需求配置服務卡片,並通過輕掃或點擊來查看詳細信息或執行操作。此外,服 ...
  • 一、是什麼 單點登錄(Single Sign On),簡稱為 SSO,是目前比較流行的企業業務整合的解決方案之一 SSO的定義是在多個應用系統中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統 SSO 一般都需要一個獨立的認證中心(passport),子系統的登錄均得通過passport,子系統 ...
  • 點贊 + 收藏 = 學會! 本篇我們介紹radash中函數柯里化和Number 相關的方法使用和源碼解析。深入學習radash中的方法思想和底層實現。 ...
  • 前言 在之前的 面試官:來說說vue3是怎麼處理內置的v-for、v-model等指令? 文章中講了transform階段處理完v-for、v-model等指令後,會生成一棵javascript AST抽象語法樹。這篇文章我們來接著講generate階段是如何根據這棵javascript AST抽象 ...
一周排行
    -Advertisement-
    Play Games
  • 1、預覽地址:http://139.155.137.144:9012 2、qq群:801913255 一、前言 隨著網路的發展,企業對於信息系統數據的保密工作愈發重視,不同身份、角色對於數據的訪問許可權都應該大相徑庭。 列如 1、不同登錄人員對一個數據列表的可見度是不一樣的,如數據列、數據行、數據按鈕 ...
  • 前言 上一篇文章寫瞭如何使用RabbitMQ做個簡單的發送郵件項目,然後評論也是比較多,也是準備去學習一下如何確保RabbitMQ的消息可靠性,但是由於時間原因,先來說說設計模式中的簡單工廠模式吧! 在瞭解簡單工廠模式之前,我們要知道C#是一款面向對象的高級程式語言。它有3大特性,封裝、繼承、多態。 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 介紹 Nodify是一個WPF基於節點的編輯器控制項,其中包含一系列節點、連接和連接器組件,旨在簡化構建基於節點的工具的過程 ...
  • 創建一個webapi項目做測試使用。 創建新控制器,搭建一個基礎框架,包括獲取當天日期、wiki的請求地址等 創建一個Http請求幫助類以及方法,用於獲取指定URL的信息 使用http請求訪問指定url,先運行一下,看看返回的內容。內容如圖右邊所示,實際上是一個Json數據。我們主要解析 大事記 部 ...
  • 最近在不少自媒體上看到有關.NET與C#的資訊與評價,感覺大家對.NET與C#還是不太瞭解,尤其是對2016年6月發佈的跨平臺.NET Core 1.0,更是知之甚少。在考慮一番之後,還是決定寫點東西總結一下,也回顧一下.NET的發展歷史。 首先,你沒看錯,.NET是跨平臺的,可以在Windows、 ...
  • Nodify學習 一:介紹與使用 - 可樂_加冰 - 博客園 (cnblogs.com) Nodify學習 二:添加節點 - 可樂_加冰 - 博客園 (cnblogs.com) 添加節點(nodes) 通過上一篇我們已經創建好了編輯器實例現在我們為編輯器添加一個節點 添加model和viewmode ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...
  • 類型檢查和轉換:當你需要檢查對象是否為特定類型,並且希望在同一時間內將其轉換為那個類型時,模式匹配提供了一種更簡潔的方式來完成這一任務,避免了使用傳統的as和is操作符後還需要進行額外的null檢查。 複雜條件邏輯:在處理複雜的條件邏輯時,特別是涉及到多個條件和類型的情況下,使用模式匹配可以使代碼更 ...
  • 在日常開發中,我們經常需要和文件打交道,特別是桌面開發,有時候就會需要載入大批量的文件,而且可能還會存在部分文件缺失的情況,那麼如何才能快速的判斷文件是否存在呢?如果處理不當的,且文件數量比較多的時候,可能會造成卡頓等情況,進而影響程式的使用體驗。今天就以一個簡單的小例子,簡述兩種不同的判斷文件是否... ...
  • 前言 資料庫併發,數據審計和軟刪除一直是數據持久化方面的經典問題。早些時候,這些工作需要手寫複雜的SQL或者通過存儲過程和觸發器實現。手寫複雜SQL對軟體可維護性構成了相當大的挑戰,隨著SQL字數的變多,用到的嵌套和複雜語法增加,可讀性和可維護性的難度是幾何級暴漲。因此如何在實現功能的同時控制這些S ...