xml規範
xml的傳統在於文件領域,這在其語法規則中得到了體現。 它的語法比與資料庫記錄有關的資料格式的語法寬鬆。 xml解析器將xml文件的編碼形式(在xml宣告中指定了編碼)轉換為表示xml文件中資訊的抽象模型。 w3c將此抽象模型形式化為xml infoset(請參閱參考資料 ),但是許多xml處理必須著重於編碼的源形式,這允許大量的詞彙差異:屬性可以以任何順序出現; 空格規則在元素名稱及其屬性之間的位置很靈活; 可以使用幾種方法來表示字元,並轉義特殊字元,等等。 命名空間引入了更多的詞法靈活性(例如字首選擇)。 結果是,您可以擁有許多與xml 1.0規則完全等效的文件,而在按編碼源進行逐字節比較時卻有很大不同。
這種詞彙上的靈活性在諸如回歸測試和數字簽名之類的領域中引起了問題。 假設您建立了乙個測試套件,其中包括乙個案例,該案例希望清單1中的文件為正確的輸出。
清單1.示例xml文件
123
如果進行適當的xml測試,您將希望將清單2中的文件識別為正確的輸出。
清單2.清單1中的xml文件的等效形式
<?xml version="1.0" encoding="utf-8"?>
123
標籤內的空白不同,屬性的順序不同,並且字元實體已替換為等效的文字字元-但是資訊集仍然相同。 通過逐字節比較很難建立這種相同性。 對於數字簽名,您可能要確保通過郵件系統傳送文件時,該文件在此過程中沒有被損壞或篡改。 為此,您需要具有加密雜湊或完整的文件數字簽名。 但是,如果您通過訊息傳遞系統傳送清單1 ,則可以通過正常處理看起來像清單2那樣 。 如果是這樣,即使文件沒有實質性更改,簡單的雜湊或數字簽名也將不匹配。
w3c對此的解決方案是xml數字簽名規範的一部分。 w3c定義了規範的xml(請參閱參考資料 ),這是xml的規範化詞法形式,其中所有允許的變體都已刪除,並且施加了嚴格的規則以允許一致的逐字節比較。 轉換為規範形式的過程稱為規範化(通常縮寫為「 c14n」)。 在本文中,您將學習xml規範形式。
現在不要擔心其中一些規則不清楚。 我將提供更詳細的解釋和更多更常見規則的示例。 在本文中,我不會涉及涉及dtd驗證的任何c14n步驟。 我已經多次提到xml infoset,但是有趣的是w3c選擇定義c14n的方式不是根據infoset,而是根據xpath資料模型,它是比infoset更簡單(並且有人認為更乾淨)的資料模型。 這可能是次要的細節,不會影響您對規範形式的大部分理解,但是如果您還必須使用基於infoset的技術,則需要牢記這一點。
通過在標籤內應用特定的空白規則以及命名空間宣告和常規屬性的特定順序,可以對標籤進行規範化。 以下是我自己的規範化開始標籤格式的非正式序列:
尖括號(<),後跟元素qname(字首,冒號和本地名稱)。
預設的命名空間宣告(如果有),然後是所有其他命名空間宣告,按照它們定義的字首的字母順序排列。 省略所有冗餘的命名空間宣告(那些已在祖先元素中宣告但未被覆蓋的命名空間)。 在每個命名空間宣告之前,請使用單個空格,在等號的兩側都不能使用空格,並在命名空間uri周圍使用雙引號。
所有按字母順序排列的屬性,其前都有乙個空格,等號的兩邊都沒有空格,並在屬性值兩邊加上雙引號。
最後,用尖括號(>)。
規範的結束標籤要簡單得多:尖括號(<)後跟元素qname,然後尖括號(>)。 清單3是非規範形式的xml示例。
清單3.非規範形式的xml樣本
<?xml version="1.0" encoding="utf-8"?>
123
清單4是規範形式的同一文件。
清單4.清單3為規範的xml
123
為了規範化清單3,需要進行以下更改:
我測試使用python中c14n模組,附帶的pyxml(見規範形式轉換相關主題 )。 清單5是我用來規範化清單3到清單4的**。
清單5.用於規範化xml的python**
from xml.dom import minidom
from xml.dom.ext import c14n
doc = minidom.parse('listing3.xml')
canonical_xml = c14n.canonicalize(doc)
print canonical_xml
規範形式的字元資料基本上是盡可能的原義:字元實體解析為原始unicode(然後將其序列化為utf-8)。 cdata節被其原始內容替換; 以及沿著這些思路的更多變化。 這對於屬性值和內容中的字元資料都是如此。 屬性也根據其dtd型別的規則進行規範化,但這在很大程度上影響了使用dtd的文件,在本文中我不會介紹。 清單6是乙個示例文件,部分基於c14n規範中的示例。
清單6.用於演示字元資料規範化的示例xml
<?xml version="1.0" encoding="iso-8859-1"?>
first line
second line
2"0" && value<"10" ?"valid":"error"]]>
"0" && value<"10" ?"valid":"error"'>valid
清單7是規範形式的同一文件。
為了規範化清單6,需要進行以下更改:
我在清單6和7中沒有提到的重要步驟是轉換為utf-8,這在文章清單中不容易說明。 假設源文件的字元引用為©
(代表版權標誌)。 規範形式將其替換為utf-8序列,該序列包括十六進製制位元組c2和十六進製制位元組a9。
有時您實際上是想簽名或比較xml文件的子樹,而不是整個。 也許您只想簽名soap訊息的主體,而忽略信封。 w3c在專有規範格式規範中對此進行了規定,該規範幾乎完全與整理目標子樹內外的命名空間宣告有關。
我提到了由字首選擇引起的潛在差異。 xml命名空間規定字首是無關緊要的,因此兩個僅在命名空間字首選擇上不同的檔案應被視為相同。 不幸的是,c14n無法解決這種情況。 一些完全有效的xml處理操作可能會修改字首,因此請注意這一潛在問題。
規範xml是掌握的重要工具。 您可能不會立即參與與xml相關的安全性或軟體測試,但是一旦熟悉c14n就會經常出現,這會讓您感到驚訝。 這是可以幫助您避免很多一開始可能會遇到的麻煩的事情之一。
翻譯自:xml規範
xml書寫規範
xml也就是擴充套件標識語言,可以實現跨平台,真正做到資料和顯示分離,對於webservices等其他網路上資料的傳輸等較多使用。下邊根據個人理解簡單介紹一下xml的一些規範。1 xml文件有且只有乙個根標籤,所謂的根標籤就是一對 根標籤 和就是根標籤了 2 xml文件內沒乙個開始標籤都必須對應乙個...
XML語法規範
一 如何宣告乙個xml檔案 有兩部分組成 宣告部分 宣告xml的版本與編碼,如下 文件節點部分 節點名 節點名 注意 在xml 裡,節點 元素 標籤,乙個意思 二 整個文件有且只有乙個根節點,如 正確 錯誤 三 標籤 標籤必須成對出現,進行閉合,如 而且標籤還區分大小寫 在xml標籤屬性全小寫 或者...
關於xml的規範
關於xml的規範 宣告文件型別為html,同時制定解析規則遵循 xhtml1.0的規則 xmlns是xhtml namespace的縮寫。作用 由於xml允許定義自己的標記,但你定義的標記和其他人定義的標記有可能相同,但表示不同的含義。當文件交換或者共享的時候就容易產生錯誤。為避免這種錯誤產生,xm...