Canonical XML
Canonical XML(规范化形式的XML)XML规范的一个子集。任何XML文档都可以转换为规范化形式的XML,因此将特定类型的微小差异去除却仍是该XML文档。由于这些特定的差异通常不认为是有意义的,转换成规范化形式的XML是判断两个XML文档逻辑上是否是同一个文档的好办法。
举例来说,XML允许在开始标签(tag)的不同点出现,属性可以按任何顺序书写,这些差异很少用来表达含义,因此这些形式通常被认为是相等的
<p class="a" secure="1">
<p secure = "1" class='a' >
在将一个任意XML文档到规范化形式的XML的转换中,属性将按标准书序(名字的字母顺序)排列,空格和引号被标准化。 这样上面的第二种形式将转换成第一种。
Canonical XML定义了一些规范化形式的规则,包括:
- 使用UTF-8编码
- 用0x0A字符表示换行符
- 属性值里的白空格被正规化
- 添加缺省属性的说明
- CDATA标记的部分替换为相应的文字字符
- 展开实体引用
- 删除XML的声明和DTD
- 空元素使用开始/结束标签对,而不是用特殊的空元素语法
- 属性按照属性名的字母顺序排序
- 删除元素中多余的命名空间声明
讲一个文档转换为规范化形式的XML是幂等的。 也就是说,第一次转换通常产生与原文档不同的字符串,而重复的转换将不再产生变化。
根据W3C的规范,如果两个XML文档具有相同的规范化形式,那么在一定的应用上下文(极少见的情形除外)中,这两个文档在逻辑上是相等的。
然而,在特殊的上下文中,用户可能关心规范形式的XML逻辑等价之外的特殊语义。比如说,隐写术系统可能在XML文档中通过不同的白空格,属性引号和顺序,使用十进制或十六进制数字字符等等来隐藏信息。显然,将这样的文件转换为标准化形式的XML将丢失这些特殊的语义。而另一方面,XML文件使用大小写的不同,单词使用古代的拼写或现代的拼写等,在某种意义上可以看作是相同的,这样的语境超过了标准化形式XML的范围。