XML Schema

来源:https://www.cnblogs.com/kungfupanda/archive/2019/10/10/11645560.html
-Advertisement-
Play Games

XML Schema XSD (XML Schema Definition)是W3C於2001年5月發佈的推薦標準,指出如何形式描述XML文檔的元素。XSD是許多XML Schema 語言中的一支。XSD是首先分離於XML本身的schema語言,故獲取W3C的推薦地位。 像所有XML Schema ...


XML Schema


XSD (XML Schema Definition)
W3C於2001年5月發佈的推薦標準,指出如何形式描述XML文檔的元素。XSD是許多XML Schema 語言中的一支。XSD是首先分離於XML本身的schema語言,故獲取W3C的推薦地位。

像所有XML Schema 語言一樣,XSD用來描述一組規則──一個XML文件必須遵守這些規則,才能根據該schema‘合法(Valid)’。

然而,與其他XML Schema 語言不同,XSD意圖設計為在確認一個文檔的有效性時,將會產生滿足特定數據類型的一個信息集合。這種後驗證的XML信息集可用來開發XML文件處理軟體。

目錄

XSD名稱的來源

因為有其他XML schema 語言存在,故在引用這W3C建議的語言時,使用XML Schema或W3C XML Schema,Schema永遠首碼大寫。

“XML Schema”在2001年5月成為W3C推薦標準。由於“XML Schema”作為一種W3C的推薦標準的名字與廣義的XML Schema 語言存在名稱上的混淆,用戶社區的一部分人採用了“WXS”來稱呼它, 用戶社區的另一部分人採用“XSD”(XML Schema Definition首字母縮略字)來稱呼它。W3C發佈的1.1標準採用了“XSD”作為官方稱呼。

歷史

在官方文檔的參考附錄里,XSD標準承認受到[文件類型描述|DTD]]和其他早期XML schema 語言的影響,如DDMLSOXXML-Data、以及XDR。XSD從中吸收了一些特性,然而也在這些特性中有所折衷。這些早期schema 語言中的XDR與SOX在XML Schema發佈後仍繼續使用了一段時間。不少微軟的產品支持XDR直到2006年十二月MSXML 6.0的發佈(MSXML 6.0拋棄了XDR改用XSD)[1] 。Commerce One, Inc支持它自己的SOX schema 語言直到該公司於2004年末破產。2004年十二月,Novell, Inc.購買了該公司,包括那些與SOX相關的專利,據報導是儘力防止被某些不相關的、以打專利相關官司為生的公司剝削圖利[2] 。

著名的XSD建議的內容但在XML自己的DTD中不可用的特性是名字空間感知(namespace awareness)與數據類型。

2012年4月, XSD 1.1成為W3C推薦標準。April 2012

Schema與schema文檔

技術上說schema是元數據的一個抽象集合,包含一套schema component: 主要是元素與屬性的聲明、複雜與簡單數據類型的定義。這些schema component通常是在處理一批schema document時被創建。schema文檔包含著schema component的源語言定義。在日常使用中,一個schema文檔常被稱作一個schema。

Schema文檔通過名字空間組織起來:所有的被命名的schema component屬於一個目標名字空間;這個目標名字空間是schema文檔作為整體的一個屬性。schema文檔可以包含進來(include)使用同一名字空間的其它schema文檔,也可以導入(import)使用不同名字空間的schema文檔。

當一個實例文檔針對一個schema來驗證有效性時(這一過程稱為assessment),用來驗證有效性的schema可以作為參數提供給驗證器,也可以在實例文檔中作為兩種特殊屬性之一直接提供:

  • xsi:schemaLocation
  • xsi:noNamespaceSchemaLocation.這種機制要求客戶啟動驗證以充分相信這個文檔,知道文檔對正確的schema是有效的。

"xsi"是名字空間"http://www.w3.org/2001/XMLSchema-instance"的傳統首碼。

XML Schema Documents通常有文件擴展名".xsd". XSD還沒有專門的互聯網媒體類型,因此按照 RFC 3023使用"application/xml"或"text/xml" .

Schema component

主要的schema component有:

  • 元素聲明(Element declaration), 定義了元素的性質。包括:元素名字、目標名字空間;一個非常重要的性質是元素的類型,它限制了元素包含哪些屬性與子元素。在XSD 1.1標準中,可以根據屬性的值來有條件定義元素類型。一個元素可以屬於一個替換群(substitution group),如果元素E在元素H的替換群中,那麼schema許可H出現的地方E都可以出現。元素可以有完整性(integrity)約束:唯一性(uniqueness)約束確定特定值在該元素為根的子樹中是獨一無二的;引用(referential)約束確定值必須匹配一些其它元素的標識符。元素聲明可以是全局的或局部的,允許同一個名字被用於一個實例文檔的不同部分的不相關的元素。
  • 屬性聲明(Attribute declaration),定義了屬性的性質。包括:屬性名字、目標名字空間,屬性類型限制了屬性可以取哪些值,也可以指出屬性的預設值或固定值(fixed value,即屬性只能取這個值)。
  • 簡單與複雜數據類型(Simple and complex type).詳見下節
  • 模型群(model group)與屬性群(attribute group)定義。這實際上是巨集(macro):被命名的元素的群與屬性的群,可在許多數據類型定義中被重用。
  • 屬性使用(attribute use)表示覆雜數據類型與屬性聲明的關係,指出屬性是必需的還是可選的,在什麼時候使用這種數據類型。
  • 元素粒子(element particle)類似於表示覆雜類型與元素的關係,指出元素在上下文中出現的最大與最小次數。類似於元素粒子,內容模型可以包括模型群粒子,在語法上相當於非終結符:定義了允許的元素序列的選擇與重覆的單位。此外,通配符粒子表示了一套元素或元素序列。

其它更專門的schema component包括annotations, assertions, notations, 以及包含了schema整體信息的schema component.

數據類型

簡單數據類型(simple type)包含了可以出現在元素或屬性的文本值。這是XSD與DTD的最大區別。

XSD提供了一套19個基本數據類型:

  • anyURI
  • base64Binary
  • boolean
  • date
  • dateTime
  • decimal
  • double
  • duration
  • float
  • hexBinary
  • gDay
  • gMonth
  • gMonthDay
  • gYear
  • gYearMonth
  • NOTATION
  • QName
  • string
  • time).

可以從這些基本數據類型通過三種機制構建三種數據類型:

  • restriction (減少值集的範圍),
  • list (允許一個值的序列),
  • union (允許從幾個數據類型中選擇值).

XSD規範定義了25個導出數據類型。用戶可以在schema中進一步定義自己的導出類型。

Restriction機制包括指出最大最小值、正則表達式、限制字元串的長度、限制十進位數的位數等。XSD 1.1又增加了assertions, 即通過一個[XPath 2.0]]表達式給出任意約束的能力。

複雜數據類型描述了一個元素的許可內容。包括這個元素、屬性、子元素的許可內容。複雜類型定義由一套屬性使用與一個內容模型組成。內容模型可以是:

  • 只有元素的內容(element-only content), 不允許有文本(但可以有空白符或者子元素可以有文本);
  • 簡單內容(simple content), 允許有文本,不允許有子元素;
  • 空內容(empty content), 文本與子元素都不被允許;
  • 混合內容(mixed content), 文本與子元素都可以有.

複雜數據類型可以從別的複雜類型導出:

  • restriction方法,不允許基類型允許的一些元素、屬性或者值
  • extension方法,允許額外的屬性或元素出現。

XSD 1.1又增加了assertion方法來約束複雜類型, 即通過一個[XPath 2.0]]表達式必須求值為真

Schema 既驗信息集(Post-Schema-Validation Infoset)

基於 Schema 的驗證完成後,可以按照 Schema 所隱含的數據模型來表達文檔的結構與內容。XML Schema 數據模型包括:

  • 辭彙(元素與屬性名稱集)
  • 內容模型(關聯與結構)
  • 數據類型

這些信息的集合即為 Schema 既驗信息集(Post-Schema-Validation Infoset (PSVI))。對於有效的 XML,PSVI 給它賦以特定的“類型”,從而便於以對象方式來處理整個文檔,並應用面向對象程式設計(OOP)範式。

XML Schema的次要用途

XML Schema的主要用途是形式描述XML文檔,然而最終的schema除了簡單驗證文檔外還有許多其他用途。

代碼生成

Schema可用於生成代碼,這稱作{[tsl|en|XML Data Binding}}。這些代碼允許XML文檔的內容作為編程環境中的對象。

XML文件結構文檔的生成

Schema可用於產生人可讀的文檔來描述一個XML文件的結構。這在作者利用了標記元素(annotation element)時非常有用。

批評

雖然XML Schema獲取了廣泛的成功應用,但也受到了大量嚴厲的批評,遠超出其他W3C推薦標準。下述研究者很好地總結了這些批評:James Clark,[1] Anders Møller與Michael Schwartzbach,[2] Rick Jelliffe[3],David Webber.[4]

一般問題:

  • 推薦標準數百頁,語句非常技術化,對於非專業的用戶來說過於複雜難讀。很多人發現W3Cs XML Schema Primer更易於理解.
  • XSD缺少形式化數學規範,這使得關於schema的自動推理很困難,例如證明一個修改過的schema是向後相容的。
  • 語言中有很多例外,如元素的限制(restriction)不同於屬性的限制。

表達能力的實踐限制:

  • XSD對無序內容提供了極少支持
  • XSD不能要求提供root element (因而要求額外的信息來驗證即使最簡單的文檔).
  • 在描述mixed content, 沒有任何方式約束字元內容(甚至沒辦法指定一個有效字元集).
  • 內容與屬性聲明不能依賴於元素或屬性上下文 (這也是DTD的一個大問題).
  • 不是100%自描述 (上一點就是個例子), 即使有這樣的初始設計需求.
  • 預設不能被獨立於聲明被指定(這使其不能給出一族schema盡在預設值上不同);元素預設只能是字元數據(不包含markup).

技術問題:

  • 雖然從技術上遵從名字空間,但看起來並不追隨名字空間的精神原則。(例如 "unqualified locals").
  • XSD 1.0不提供機制,使得一個屬性的值或者存在依賴於另一個屬性的值或存在(被稱為co-occurrence constraints). XSD 1.1解決了這個問題.
  • XSD數據類型的範圍非常隨意.[5]
  • 驗證與擴增(augmentation,增加類型信息與預設值)應該保持分離。

示範

一個Schema的簡易示例,描述某個指定的國家,是這樣的:

<xs:schema
 xmlns:xs="http://www.w3.org/2001/XMLSchema">
   <xs:element name="country" type="Country">
     <xs:complexType name="Country">
      <xs:sequence>
       <xs:element name="name" type="xs:string"/>
       <xs:element name="population" type="xs:decimal"/>
      </xs:sequence>
     </xs:complexType>
   </xs:element>
</xs:schema>

一份遵從這個視圖的XML文件:

<country
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:noNamespaceSchemaLocation="country.xsd">
  <name>France</name>
  <population>59.7</population>
</country>

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

-Advertisement-
Play Games
更多相關文章
  • (註:本人在centos7進行的安裝及使用) 1.安裝wget 2.下載mysql安裝包 3.安裝mysql(這裡每個人網速不同,安裝時間不同) 4.啟動mysql服務,將mysql服務設置為開機啟動 5.當第一次啟動MySQL伺服器時,為MySQL根用戶生成一個臨時密碼。 您可以通過運行以下命令找 ...
  • Mysql常用命令行大全 1、連接Mysql 格式: mysql -h主機地址 -u用戶名 -p用戶密碼1、連接到本機上的MYSQL。首先打開DOS視窗,然後進入目錄mysql\bin,再鍵入命令mysql -u root -p,回車後提示你輸密碼.註意用戶名前可以有空格也可以沒有空格,但是密碼前必 ...
  • 此題相較於 做了一些改進: 創建 ; 需要判斷傳入參數的合理性. 因此,對代碼改動如下所示: mysql CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT BEGIN DECLARE P INT DEFAULT N 1; IF (P ...
  • //OBJC_ASSOCIATION_ASSIGN類似於我們常用的assign,assign策略的特點就是在對象釋放以後,不會主動將應用的對象置為nil,這樣會有訪問僵屍對象導致應用崩潰的風險。為瞭解決這個問題:我們可以創建一個替身對象,以OBJC_ASSOCIATION_RETAIN_NONATO ...
  • 一、isa指針結構 分析: 1.我們知道,實例對象的isa指針指向該對象所屬類的類對象;類對象的isa指向其元類對象; 2.真機為arm64架構,模擬器和mac電腦為x86架架構,以下以arm64為例講解; 3.在64位系統下,指針所占位元組為8個即64位; 4.在arm64之前,isa就是一個普通的 ...
  • 前段時間因為一個bug,研究了一下android binder的大概流程,方便自己理解畫了一個框圖。 粗點線箭頭是繼承關係,細實線箭頭是調用關係。 ...
  • 最近需要實現導航功能,其中路線規劃和導航場景如下圖所示: 上面的截圖中,路線上面都繪製出了路名,方便用戶查看自己選擇的路線都經過了哪些道路。這裡用到的地圖的能力即為 騰訊地圖 Android SDK v4.2.7 已經開放了實現此功能的能力。 主要涉及介面如下: 介面名稱 | 功能概述 : | : ...
  • axios的除了初始化配置外,其它有用的應該就是攔截器了,攔截器分為請求攔截器和響應攔截器兩種: 請求攔截器 ;在請求發送前進行一些操作,例如在每個請求體裡加上token,統一做了處理如果以後要改也非常容易。 響應攔截器 ;是在接收到響應後進行一些操作,例如在伺服器返回登錄狀態失效,需要重新登錄的時 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...