xml 去除 xml声明_始终使用XML声明

xml 去除 xml声明

W3C XML 1.0建议书的2.8节部分规定:

XML文档应该以XML声明开头,该声明指定所使用的XML版本。

“ SHOULD”在形式上是RFC 2119术语,在该RFC中定义如下:

这个词,或形容词“推荐”,意味着在特定情况下可能存在忽略特定项目的正当理由,但是在选择其他课程之前,必须理解并仔细权衡所有含义。

我和许多XML专家更严格地认为, 没有充分的理由忽略XML声明。 它提供有关XML文档的句法基础的基本信息。 如果您依赖默认值,则可能会遭受意外错误的影响。

分解声明

XML声明采用以下形式:

<?xml version opt._encoding opt._standalone?>

声明的三个关键位是一些所谓的伪属性 ,因为它们在语法上看起来类似于属性。 如果存在,则编码声明必须遵循版本,如果存在,则独立声明必须是最后的伪属性。

由于XML 1.1已被批准为W3C建议书,因此声明XML版本尤其重要。 XML 1.1以较小但确定的方式更改了格式正确性的定义。 一个不错的变化是XML 1.1使XML声明成为强制性的。 该建议指出:

XML 1.1文档必须以XML声明开头,该声明指定所使用的XML版本。

重点是我的。 根据定义,任何没有声明的XML文档都是XML 1.0文档。 但是,您永远不应保留未声明的版本,特别是因为指定编码也非常重要。

编码方式

XML的基础是Unicode。 XML文档中的每个字符都是Unicode字符。 如果您只记得有关XML的一个事实,那将是一个可供选择的事实。 比所有非空元素都必须具有开始和结束标签的事实更为重要。 由于Unicode字符是一种抽象,因此必须存在一种机制,以一种可以由计算机处理的形式实际表示这些字符。 这种形式称为编码 。 文档的编码仅是传输文档的一种便利,但是您应该清楚地了解XML内容的实质仍然严格是Unicode。 从编码转换为Unicode是解析器的工作。

最常见的编码是UTF-8和UTF-16,它们分别将Unicode字符作为8位和16位值的序列传输。 这也是解析器必须支持的两种编码。 如果未指定编码,则XML处理器必须根据要解析的文件开头是否存在特殊字节序列(称为Byte Order MarkBOM )来假定UTF-8或UTF-16。

我见过的最常见的XML处理问题之一是省略了XML声明,但是XML的创建者试图使用LATIN-1编码(AKA ISO-8859-1)中的完整字符补全,这很流行在美洲和西欧。 通常,不存在BOM,因此XML处理器采用UTF-8编码。 在最佳情况下,解析器会遇到一系列字节,这些字节形成非法的UTF-8序列-用户至少会收到明显的格式错误。 更为有害的情况是,LATIN-1字符巧合地形成了合法的UTF-8序列。 在这种情况下,解析器不会发出格式正确的错误信号,但是读取的XML字符可能不是作者想要的。 这种静默错误在生产系统中很难调试。

如果系统强制执行一项策略,即所有XML文档都必须具有包含编码的XML声明,那么编码为LATIN-1的文件将始终以以下内容开头:

<?xml version="1.0" encoding="|ISO-8859-1|"?>

在这种情况下,不正确地假设UTF-8不会导致任何隐式或显式错误。 上面的形式(当然,版本和编码已替换为实际值)是我强烈建议在所有XML文件中使用的最小XML声明。 即使是默认值之一(UTF-8或UTF-16),也要指定编码。

注意:以UTF-16编码的文件必须以BOM表开头,即使其编码已正确声明。

单机版

XML文档还可以发出信号,指示DTD的外部子集是否包含任何可能影响文档实际内容的声明。 当然,这仅在使用DTD时才有意义。

学过的知识

程序员之间的一个众所周知的格言是,显式比依赖于隐式行为更好。 在XML声明的情况下尤其如此。 我强烈建议您采用一个简单的策略,即所有 XML文档都必须具有包含文档编码声明的XML声明。 以我的经验,这种策略在最大程度地减少模糊的XML错误方面有很长的路要走,并且非常值得为之带来轻微的不便。


翻译自: https://www.ibm.com/developerworks/xml/library/x-tipdecl/index.html

xml 去除 xml声明

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值