XML声明节点是强制性的吗?

时间:2011-01-13 10:40:38

标签: xml naming

我与我的一位同事讨论过XML声明节点(我在谈论这个=&gt; <?xml version="1.0" encoding="UTF-8"?>)。

我认为,对于某些被称为“有效XML”的东西,它需要一个XML声明节点。

我的同事声明XML声明节点是optionnal,因为默认编码是UTF-8,版本始终是1.0。这是有道理的,但标准说的是什么?

简而言之,给出以下文件:

<books>
  <book id="1"><title>Title</title></book>
</book>

我们能说:

  1. 这是有效的XML吗?
  2. 它是一个有效的XML节点吗?
  3. 这是一个有效的XML文档吗?
  4. 非常感谢。

4 个答案:

答案 0 :(得分:32)

此:

<?xml version="1.0" encoding="UTF-8"?>

不是处理指令 - 它是 XML声明。其目的是在开始读取文档的其余部分之前正确配置XML解析器。

它看起来像一个处理指令,但与实际处理指令不同,它不会成为解析器创建的DOM的一部分。

“有效” XML没有必要。 “有效”表示“表示明确定义的文档类型,如DTD或架构中所述。没有架构或DTD,单词“valid”没有任何意义。

许多人误用“有效”,当他们真正意味着“格式良好”时。格式良好的XML文档是遵循XML的基本语法规则的文档。

由于versionencoding1.0UTF-8 /(UTF-16 /的默认设置,文档格式也不需要XML声明分别为{{1}})。如果文件中存在Unicode BOM(字节顺序标记),则它确定编码。如果没有BOM并且没有XML声明,则假定为UTF-8。

这是一个关于编码声明和检测如何在XML文件中工作的规范线程。 How default is the default encoding (UTF-8) in the XML Declaration?


问题:

  1. 这是有效的XML?
    没有DTD或架构,这是无法回答的。不过,它结构良好。
  2. 这是一个有效的XML节点?
    节点是与文档(DOM)的内存中表示相关的概念。由于格式良好,因此可以将此片段解析为节点。
  3. 这是一个有效的XML文档?
    见#1。
  4. 你在这里混淆了一些XML概念(不用担心,这种混淆很常见,部分源于这些概念重叠并且名称经常被误用)。

    • 一切都以结构化数据开始,包括以树形式组织的名称,值和属性。
    • XML 最基本上是指以文本形式表示此结构化数据的语法(它是“标记语言”)。当您将树序列化树形成一串字符时,它就可以用来将一串字符反序列化到树中。
    • 文档通常是指代表序列化树的字符串。它可以存储在文件中,通过网络发送或在内存中创建。
    • 严格定义了序列化和反序列化的规则。可以成功反序列化为树的文档(“字符串”)被称为格式良好
    • 这样的树的语义(允许的元素,元素计数和顺序,名称空间,任何数量的复杂规则,确实)可以在所谓的DTD或模式中定义。如果树遵循一组明确定义的语义,则称其为有效
    • 术语文档对象模型(DOM)是指结构化数据的标准化内存中表示。它是使用标准化方法访问此树的定义良好的API的名称。
    • 节点是文档对象模型的基本数据结构。

答案 1 :(得分:2)

根据可扩展标记语言(XML)1.0(第五版) W3C 2008年11月26日建议书,部分: http://www.w3.org/TR/2008/REC-xml-20081126/#sec-prolog-dtd
没有xml声明,它无效(即使它格式正确,完整)。

答案 2 :(得分:0)

规范声明:

Definition: XML documents SHOULD begin with an XML declaration which specifies the version of XML being used.

并且对于有效的文档,它应该具有与之关联的文档类型声明。您在此处显示的代码段似乎是一个状态良好的节点,但绝不是有效的文档。

答案 3 :(得分:0)

请注意,有效性取决于与文档关联的DTD或架构。在你的情况下

<books>
  <book id="1"><title>Title</title></book>
</book>

DTD必须具有的最小值是ELEMENT“books”,“book”和“title”,并且“book”具有带“id”的ATTLIST,定义“id”的类型以及它是强制性的还是可选的。它还会声明“book”可以/必须包含“title”,“title”可以(或必须)包含PCDATA内容(字符串)。

DTD也可能声明必须存在某些其他元素,在这种情况下,您的XML文档将无效。有许多DTD会使您的文档有效,而许多DTD会使其无效。