網絡編程和自動化基礎-43

2022-01-02 Open Networking
除了格式正確之外,XML文檔還必須符合另一個條件:它必須是有效的。有效性意味著文檔格式正確並且包含正確的內容。為了有效,文檔必須格式良好,並且必須符合由XML DTD文件或XML模式表達的文檔類型準則。

確保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解析器會根據指令找到合適的XSD文件並根據它驗證XML文檔。因為XSD是用XML格式編寫的,所以下例的XSD格式對您來說可能很熟悉。由於XSD是用XML編寫的,因此它從XML聲明開始,就像普通的XML文檔一樣。此聲明後跟根元素,始終稱為 <scheme>。W3C為XSD方案開發了一個字典,本例中的特定XML名稱空間稱為xmlns:xs=」http://www.w3.org/2001/XMLSchema,並且根元素<scheme>的前綴是<xs:scheme>。您可以在示例中看到,使用了該名稱空間中的兩個屬性:targetNamespace指向已驗證的XML文檔中使用的名稱空間。elementFormDefault定義驗證的XML文檔中的所有元素都與聲明為targetNamespace的命名空間相關,而不是與任何命名空間相關。

創建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

技術交流群(僅限行業和技術交流,嚴禁廣告,非誠勿擾):

相關焦點

  • 網絡編程和自動化基礎-42
    本篇開始介紹網絡可編程性堆棧中的第一種編碼格式:可擴展標記語言 (XML)。XML用於對網絡可編程協議的消息進行編碼。
  • 網絡編程和自動化基礎-32
    URI表示為字符序列,大致由兩部分組成:方案和根據特定方案規定的標準格式化的字符串。該方案是接入網絡協議,如HTTP、FTP或Telnet 。模式和後面的字符串用冒號分隔。後面將詳細討論URI的一般語法。URL代表統一資源定位器。URL是映射到特定訪問機制(即網絡協議)的URI。在這種情況下,方案是網絡協議,例如FTP、HTTP、HTTPS、gopher、mailto或Telnet。
  • 自動化程式語言的未來
    未來的自動化操作可能使用多種程式語言,對於程式設計師來說,了解哪些語言是可用的、適合於哪些領域,以及如何用其創建可讀、有資源支持的代碼將至關重要。梯形圖邏輯,是可編程邏輯控制器(PLC)的主要程式語言之一。它簡單易用,並以圖形方式表示繼電器觸點和線圈。
  • 【讓調參全部自動化】自動機器學習,神經網絡自主編程(代碼與訣竅)
    KDnuggets 的主編 Matthew Mayo 寫了一篇文章介紹了 AutoML 的概念,以及為什麼要做自動機器學習。本文後附 AI 軟體工程師 Thibault Neveu 發表在 Medium 的文章,介紹他如何訓練神經網絡自動編程。在過去幾年,自動機器學習(AutoML)成了一個研究的熱點。
  • 職場提升新技能,風變編程Python讓繁瑣的工作自動化
    自動化辦公也稱辦公自動化(英語:Office Automation),簡稱OA,指的是應用計算機、電子設備和軟體,來數位化地創建、收集、存儲、處理,並傳播完成辦公室任務所需的信息。自動化辦公是一個廣泛的概念,並沒有特指某一項技術。因此我們可以把一切通過數位化方式完成的辦公室任務,並帶來效率提升的應用叫做自動化辦公。
  • Python程控儀器自動化(2)網絡分析儀例程
    本文是射頻儀器程控方法和系列python例程代碼的第2篇,網絡分析儀。
  • 《自動化學報》43卷9期網刊已經發布, 敬請關注!
    ,隨著相關應用的拓展,一些理論和應用問題開始得到更多的關注.近年來,區塊鏈和比特幣的相關概念已經逐漸擴散到其他的學術領域.但是,對區塊鏈和比特幣相關主題的知識結構(Intellectual structure),包括知識基礎(Intellectual base)和研究前沿(Research front)的探討較少,定量化研究基本為空白.本文通過對Web of Science資料庫收錄的相關文獻進行計量分析
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    ,然後再根據自 己的需求和規劃選擇學習其他方向課程,學完後一定要多實踐 總目錄 零基礎全能篇(4套課程) 實用編程技巧進價(1套課程) 數據分析與挖掘(8套課程) 辦公自動化(3套課程) 機器學習與人工智慧(7套課程) 開發實戰篇(4套課程) 量化投資(2套課程) 網絡爬蟲(
  • "Selenium+Python自動化技術與實戰"——自動化測試基礎——1(持續更新)
    關鍵點是程式語言。機器學習一個程式語言,輕鬆和簡單到令人髮指的地步:安裝上去,機器就學會了。好在人類學習程式語言也不是特別難的事情。有了程式語言,就有了人機交流的橋梁,剩下的事情,是幫機器挑選工具。做對應的測試,找到對應的工具,這樣自動化就自動起來了。
  • Python程式設計師的聖經:《Python編程快速上手:讓繁瑣工作自動化》
    然而現實不會一帆風順,學程式語言必須要持之以恆!Python學習者需要持之以恆,並在學習中成長。與Python有關的書有上百本,然而沒有任何一本書可以與下面這本書相媲美:《Python編程快速上手:讓繁瑣工作自動化》。學習者僅需要深入閱讀這本書。
  • 【java網絡】編程基礎
    Java 網絡編程
  • java網絡編程之基礎知識點總結
    概述本文是網絡編程系列的第一篇文章,所以不講代碼,主要是網絡編程的一些基礎知識,下面的這些知識點主要是對java網絡編程這本書的歸納與整理。有興趣的同學可以看看。我們知道計算機之間的通信要經過一系列複雜的過程,計算機之間通過傳輸介質、通信設施和網絡通信協議互聯,實現資源共享和數據傳輸。
  • 我這個編程小白是怎麼實現自動化程序交易的?(非廣告非條件單)
    7月4號我曾經寫過一篇文章叫《零基礎編程小白挑戰投資策略自動化交易(一)》(連結),可能標題和內容都比較枯燥,這篇文章只有195次閱讀,就算讀了的朋友應該也覺得很無聊,早就忘了吧。可是這篇文章對我來說很重要,為了實現裡面的目標,我最近一個多月除了上班、帶娃、寫公眾號以外的業餘時間,基本上都撲在電腦前面努力研究。
  • Hadoop基礎-MapReduce編程模型(一)-以wordcount和sort為例
    在<<Hadoop基礎-不使用分布式系統怎麼做並行計算>>中提到了做並行計算需要解決的幾個問題。
  • 網絡編程基礎學習筆記2:socket接口及網絡編程三要素
    對於網絡編程而言,由於其底層語言是通過C語言來實現的,所以建議在學習的時候使用C語言來進行學習!網絡編程中常用的socket接口如下:socket()接口,用於創建socket;bind():用於綁定socket到本地地址和埠,通常由服務端調用(客戶端一般直接由connect直接主動去連結服務端);listen():用於開啟監聽模式,TCP專用;accept():用於伺服器等待客戶端連接,該情況一般在阻塞狀態下產生
  • 自動化專業解讀――自動化學習、研究和就業方向
    學好自動化:多學多做通實務自動化基礎課重、專業課多,是著名的「通吃」專業,而自動化專業培養見效快,人才適應性好,也是在以「精」聞名的理工專業裡較為不同的。大一的基礎課整個信息學院都大同小異由許多基礎課組成,比如數學和物理。
  • 瞻博網絡宣布計劃收購Apstra 通過領先的意圖網絡和自動閉環保障...
    Apstra將成為這一策略的加持者,通過將其基於多供應商開放架構的下一代網絡自動化與瞻博網絡數據中心網絡組合產品(基於為下一代數據中心和雲網絡設計的經過驗證的開放式可編程高等級作業系統此外,瞻博網絡交換機一直以EVPN-VXLAN架構能力而有別於競爭對手,現在與Apstra進行了集成,可以自動部署服務,安全地實施變更,促進自動化數據中心的架構管理和簡約運營。
  • 瞻博網絡宣布計劃收購Apstra,通過領先的意圖網絡和自動閉環保障...
    瞻博網絡旨在運用人工智慧驅動的自動化改變雲時代建設、運營和保障方式。Apstra將成為這一策略的加持者,通過將其基於多供應商開放架構的下一代網絡自動化與瞻博網絡數據中心網絡組合產品(基於為下一代數據中心和雲網絡設計的經過驗證的開放式可編程高等級作業系統Junos)結合在一起,可以加快這一策略的進程。在公有雲和私有雲建設者駛入自主運行網絡?
  • Linux C網絡編程[Socket]
    現在的跨平臺網絡編程框架很多,如Java的SSH,C/C++的Boost等。  現在的分布式框架很多,如Hadoop等。  我的任務是把一個C/C++程序做成分布式,要求的不配環境,基本屬於純計算的,結果很小。所以選擇了Socket。
  • 系統管理利器,5種適合中型企業的基礎架構自動化工具
    過去在很長一段時間中,基礎架構的安裝、配置、維護等相關的工作都需要手動完成,需要IT團隊中的許多人都參與其中,手工過程存在很大的人為錯誤風險,導致應用程式可用性,安全性和性能不佳。隨著DevOps的崛起,讓基礎架構的自動化成為了可能。現在,有多種工具可以執行基礎結構的創建、部署、管理任務。