xml规范
XML的传统在于文档领域,这在其语法规则中得到了体现。 它的语法比与数据库记录有关的数据格式的语法宽松。 XML解析器将XML文档的编码形式(在XML声明中指定了编码)转换为表示XML文档中信息的抽象模型。 W3C将此抽象模型形式化为XML Infoset(请参阅参考资料 ),但是许多XML处理必须着重于编码的源形式,这允许大量的词汇差异:属性可以以任何顺序出现; 空格规则在元素名称及其属性之间的位置很灵活; 可以使用几种方法来表示字符,并转义特殊字符,等等。 命名空间引入了更多的词法灵活性(例如前缀选择)。 结果是,您可以拥有许多与XML 1.0规则完全等效的文档,而在按编码源进行逐字节比较时却有很大不同。
这种词汇上的灵活性在诸如回归测试和数字签名之类的领域中引起了问题。 假设您创建了一个测试套件,其中包括一个案例,该案例希望清单1中的文档为正确的输出。
清单1.示例XML文档
<doc>
<a a1="1" a2="2">123</a>
</doc>
如果进行适当的XML测试,您将希望将清单2中的文档识别为正确的输出。
清单2.清单1中的XML文档的等效形式
<?xml version="1.0" encoding="UTF-8"?>
<doc>
<a
a2="2" a1="1"
>123</a>
</doc>
标签内的空白不同,属性的顺序不同,并且字符实体已替换为等效的文字字符-但是信息集仍然相同。 通过逐字节比较很难建立这种相同性。 对于数字签名,您可能要确保通过邮件系统发送文档时,该文档在此过程中没有被损坏或篡改。 为此,您需要具有加密散列或完整的文档数字签名。 但是,如果您通过消息传递系统发送清单1 ,则可以通过正常处理看起来像清单2那样 。 如果是这样,即使文档没有实质性更改,简单的哈希或数字签名也将不匹配。
W3C对此的解决方案是XML数字签名规范的一部分。 W3C定义了规范的XML (请参阅