使用规范型克服变异

ZDNet软件频道 时间:2003-04-10 作者:翻译:Java研究组织-cherami |  我要评论()
本文关键词:
使用XML文档的时候可能会因为可以接受的XML格式的变异而引起问题。规范XML的目标就是通过提供将平常的XML文档转换为规范型的方法解决那个问题。
本文译自Builder.com使用XML文档的时候可能会因为可以接受的XML格式的变异而引起问题。名字空间、空格、解析的实体以及其他方面的不同可能使得实际相等的文档看上去非常的不同。规范XML的目标就是通过提供将平常的XML文档转换为规范型的方法解决那个问题。
问题

规范XML(Canonical XML)解决的中心问题是XML文档中允许的语法差异,例如下面的两个片断是等价的:

<MyTag/>
 
 <MyTag></MyTag> 

就像你看到的,他们看上去不同但是传递的是相同的信息——一个名为MyTag 的标签,没有属性、内容以及子元素。在XML语法中还有很多像这样允许变异以及使得很难验证两个逻辑上相同的文档的例子。

解决方案

要进行验证,一个重要的内容就是为XML文档创建一个标准的表示方法。解决方法就是从原始文档创建一个规范XML文档。规范型规范标准化并约束那些不规范的XML实现。虽然所有的规范XML文档仍然是XML文档,但是并非所有的XML文档都是规范XML文档。

规范XML的定义

实际上只有很少的几个规则定义标准的XML文档(普通XML文档)和规范XML文档之间的差异。那些规则是W3C在它2001年三月提出的标准XML建议中定义的。以下几个黑体部分是XML和规范XML之间的几个主要差异。

UTF编码
UTF(Unicode Transformation Format,Unicode转换格式)编码是一种字符编码,用于定义XML文档中的字符的译码方式。通常情况下,XML文档可能使用不同的字符编码,但是规范XML规定所有的文档都必须使用UTF编码。UTF是一种允许多字节字符的编码方式,对此我们不做更深入的说明。UTF在透明的支持US-ASCII的同时支持使用除了它之外的其它字符的能力。

空元素转换
在规范XML中,空元素被转换为适当的开始和结束标签。另外,开始和结束标签之间的额外的空白被删除,元素属性以词典顺序放置。看看下面的片断:

<MyElement value="test1"  type="status"   decimal="2.0"/> 

上面的片断将产生如下的规范XML片断:

<MyElement decimal="2.0" type="status" value="test1"></MyElement> 

实体引用替换
标准的XML文档允许将数据表示为实体,但是在规范XML中,实体必须被解析并使用实际的数据替换。例如一个实体&MyEntity 必须被该实体引用的实际数据替换。

CDATA替换
所有的CDATA的内容必须使用实际的数据进行替换,其中的保留字符作为字符实体进行适当的表示。例如如下的XML片断:

<MyElement><![CDATA[<One> & <two> & <three>]]></MyElement> 

使用规范XML,我们除去CDATA并将任何保留字符像下面这样编码:

<MyElement>&lt;One&gt; &amp; &lt;two&gt; &amp; &lt;three&gt;</MyElement> 

删除XML声明、注释以及DTD声明
在规范XML中,XML声明、DTD声明以及XML注释被删除。XML声明被删除是因为当前的规范XML只能适用于XML1.0,因此文档被假设为XML1.0版本。

<?xml version="1.0" ?>
 <!DOCTYPE doc SYSTEM "doc.dtd"> 
 <!--this is my xml document -->
 <MyRootElement/> 

上面的XML片断将变成如下的内容:

<MyRootElement></<MyRootElement> 

有一个“特殊”版本的规范XML,它可以包括注释。使用带注释的规范XML,上面的片断的结果如下:

<!--this is my xml document -->
 <MyRootElement></MyRootElement> 
了解更多

上面的例子仅仅展示了全部规范XML差异中的一小片。你可以通过阅读W3C的建议文档了解更多规范XML的内容。



责任编辑:炒饭

欢迎评论或投稿


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134