在網絡自動化和編排領域,數據結構是關鍵要素之一。事實上,對於所有涉及多個組件之間的任何數據交換的分布式應用程式,數據結構是至關重要的。XML的主要目標是為數據存儲和表示創建適當的數據結構。1998年,在網際網路得到廣泛發展的時期,XML被開發用來補充HTML,HTML專注於數據可視化。XML使用戶能夠創建任何數據結構,因為它沒有任何預定義的標籤名稱或值。此外,XML文檔所支持的數據類型也存在局限性。這種靈活性在創建應用程式時非常有用;但是,重要的是要有一種機制來檢查值的內容,以防止XML文檔中的數據超出應用程式支持的範圍。因此,XML的進一步發展導致了XML DTD(文檔類型定義)和XML模式的引入,它們為XML文檔的內容添加了嚴格的約束,使其更加正式。
最新的XML標準於2008年發布,得到了負責更新標準的全球資訊網聯盟 (W3C) 的支持 (https://www.w3.org/standards/xml/core)。IETF概述了2003年RFC3470中開發IETF協議時使用XML的一般準則。
儘管是一種相對較舊的語言,但XML仍然廣泛用於網絡自動化和應用程式通信。在網絡自動化中,XML最流行的應用是通過NETCONF管理網絡元素。NETCONF消息的有效載荷是一個XML文件,其中包含配置網絡元素或獲取其狀態所需的所有信息。
對於應用程式到應用程式的通信,W3C還開發並支持了一種稱為SOAP(簡單對象訪問協議)的基於XML的協議。NETCONF通過SSH運行,而SOAP依賴於HTTP。(SOAP規範由W3C的XML協議工作組維護,直到該工作組於2009年關閉。)基於JSON數據編碼的REST框架現在比SOAP更常用於應用程式之間的通信。XML在數據結構方面非常靈活,因為您使用的所有標籤都是在創建數據結構時自己創建的。對於NETCONF應用程式,XML結構遵循網絡作業系統存儲其配置的資料庫的內部結構;在某些情況下,它可能類似於命令行界面(CLI)層次結構,而在其它情況下,它可能有所不同。儘管具有很大的靈活性,但要使XML語法正確,仍需要遵循某些格式規則。XML文檔構建塊
為了讓您熟悉XML,下例顯示了一個XML文檔。
在XML語法中,標籤由 < 和 > 字符構成。有兩種類型的標籤——開始標籤(例如,<vpn>)和結束標籤(例如,</vpn>)——它們總是成對出現的。由這些標籤構成的存儲單元稱為元素。最頂層的元素稱為根元素,每個XML文檔只能有一個根元素。
開始和結束標籤之間的所有內容都是與標籤對表示的鍵相關聯的值。通常,XML中的所有內容都應該有一個開始標籤和一個結束標籤,但此規則有兩個例外:在下例中,您可以看到XML文檔基於父/子關係。標籤 <vpn> 是 <customer> 和 <contact> 條目的父項,<contact> 和 <customer> 是 <vpn> 的子項。通常,子元素在行首用一些空格進行可視化標記,XML處理器會忽略這些空格。下例顯示了對XML處理器具有相同含義的數據表示。XML文檔中的父/子關係的數量沒有限制,如下例所示,它擴展了上例中的XML文檔。正如您在示例中看到的,多個實體可能在單個父項中具有相同的名稱,每個實體都用於數組或列表數據結構。總的來說,所有子元素從根元素開始形成一個樹結構。在這個例子中,標籤 <enabled/> 是一個空的元素標籤。
您可以創建自己的標籤,但遵循幾個命名約定很重要:
標籤名可以包含任何字母、數字以及符號(例如,、、:、和)。
標籤不能以數字或符號(例如 - 或 .)開頭。
標籤不能以XML的任何變體開頭,例如xml、XML或XmL。
標籤區分大小寫;例如 <vpn> 和 <Vpn> 是兩個完全不同的標籤。
標籤命名有五種主要方法:
全部小寫:例如,<vpn>
全部大寫:例如,<VPN>
駝峰式大小寫:例如,<VirtualPrivateNetwork>
小寫的第一個單詞後跟駝峰式:例如,<virtualPrivateNetwork>
下劃線分隔的單詞:例如,<virtual_private_network>雖然推薦使用這五種樣式,但您可以使用其它格式,只要您遵循前面的約定即可。預定義實體用於在使用某些符號時避免歧義。XML標籤中可以使用多種符號,但它們需要遵循特定規則。例如,將小於 (<) 或大於 (>) 符號與開始標籤一起使用會造成混淆(<> 或 >>)。下表列出了允許您表達符號而不產生歧義的預定義實體。XML屬性、注釋和命名空間
您可能在之前示例發現了一個更重要的概念:屬性。例如,在該示例 <site id='1'> 中,站點id是一個屬性,而'1'是它的值。必須始終在單引號或雙引號中提供值。屬性是元數據,您可以將其視為有關數據的數據。屬性值可用於為XML處理器標識有關如何處理數據的附加信息,但它不是數據本身,因此它不能包含應用程式處理的值。
在網絡自動化方面,XML屬性廣泛用於NETCONF消息中,如下例所示。在上例,屬性操作指示 NETCONF 應用程式它應該用NETCONF消息的XML正文中提供的數據替換原始接口配置。此外,在將配置應用到目標網絡設備後,<description> 標籤值中的預定義元素將呈現為local router > remote router 。上例引入了另一個重要的XML概念:注釋。XML注釋與任何程式語言中的注釋一樣,提供解釋代碼但未被應用程式處理的附加信息。如果您與團隊一起處理XML文檔以幫助彼此更好地理解數據結構,則應該使用注釋。XML中的注釋以 <!-- 開頭,以 --> 結尾。為防止歧義和XML錯誤,注釋不應在末尾以外的任何地方包含雙連字符 (--)。雖然一般來說XML屬性是任意的鍵/值對,可以幫助XML解析器處理信息(還可以幫助您通過應用某些標籤來構造數據),但也有一些特定屬性是必需的用例,您將在後面了解。正如前面提到的,當你使用XML時,你可以定義你的XML標籤,只要你遵循前面概述的約定。但是,這種自由可能會導致問題。下例顯示了一個文檔,其中相同的標籤具有不同的含義。
注意,在示例中,有兩個 <sites> 標籤包含完全不同的數據:第一個關注創建客戶BGP IP MPLS VPN所需的技術信息,而第二個包含物理地址。標籤名稱中可能有錯誤;或者,提供的XML文件可能由不同的程序使用,其中需要不同的信息。有一種方法可以在單個文檔中以不同的方式使用相同的標籤名:使用名稱空間。XML名稱空間是一個特定屬性,它定義了用於處理XML文檔特定部分的XML詞彙表。下例將XML名稱空間添加到上例中的XML文檔中。
在這個例子,xmlns屬性的值是一個URI(統一資源指示符)。xmlns是繼承的,這意味著每個子項都從其父項繼承XML命名空間。XML解析器將URI作為字符串處理,它不一定表示可以在Internet上訪問的真實網頁(儘管可能)。通常,解析器使用xmlns屬性將數據傳送到相應的軟體進行進一步處理。應用程式可以正確處理XML名稱空間,但對於人類來說,可能很難跟蹤所有父/子關係並了解特定元素屬於哪個字典。為了克服這種歧義,XML引入了前綴的概念,用於將某個標籤顯式映射到某個命名空間,如下例所示。在XML命名空間聲明期間,前綴被定義為xmlns:prefix——例如,上例中的xmlns:pr1和xmlns:pr2。定義命名空間後,所有標籤都必須以prefix:tag形式的適當前綴值開頭,例如,pr1:vpn或pr2:sites。在示例中,您可以看到兩個命名空間都在根元素中聲明,然後使用前綴映射到相應的標籤。
W3C不強制要求使用XML名稱空間。如果默認名稱空間(例如xmlns="URI")和帶前綴的名稱空間(例如xmlns:prefix="URI")都未定義,則元素隱式地與任何XML名稱空間無關。但是,某些依賴於XML的協議(例如NETCONF)要求從根元素開始就存在xmlns屬性。
在使用XML時,您還需要了解更多規則。首先,您必須始終嚴格遵守創建數據結構的父/子關係規則。下例顯示了正確和不正確的XML文檔。
在上例的第一部分中,結束標籤 </sites> 和 </site> 被錯誤地放置。使用專業的XML編輯器很容易發現這種類型的錯誤,但是使用控制臺文本編輯器(例如Linux上的vim),很容易犯這樣的錯誤。如果您創建自己的數據結構,則可以通過創建正確的標籤名稱來避免此錯誤。不幸的是,在許多已建立的YANG模塊(例如Cisco IOS XR)中,幾個相鄰的標籤非常相似(例如,標籤 <interfaces> 是 <interface> 的父級)。父標籤和子標籤的順序不正確會導致XML文檔處理出錯。
關於XML格式,您應該了解的另一件重要事情是開始標籤和結束標籤之間的所有內容都是一個值。如果有前導或尾隨空格,如下例所示,它們被視為值。
在示例的XML文檔中,關鍵客戶的值為NPF_cust1,以前導空格開頭,關鍵聯繫人的值為 info@npf .cust1,後綴為兩個空格。因為這些空間被視為值的一部分,所以在處理XML文檔時,任何涉及將值與其它值進行比較的操作都可能導致不希望的結果。
如果您遵循到目前為止描述的所有規則,將創建格式良好的XML文檔。XML文檔必須格式正確才能被正確處理。如果XML文檔包含語法違規,則它的格式不正確。XML處理器無法正確處理此類文檔,任何依賴於該文檔的應用程式都可能會失敗。
對於基於XML的應用程式,必須先解析、分析和處理整個XML文檔,然後才能完成任何進一步的活動(例如對網絡元素的更改)。因此,建議您將XML文檔保持在相當小的範圍內。否則,應用程式的性能可能會受到嚴重影響。
網絡編程和自動化基礎-41
網絡編程和自動化基礎-40
網絡編程和自動化基礎-39
網絡編程和自動化基礎-38
技術交流群(僅限行業和技術交流,嚴禁廣告,非誠勿擾):