我和我的一个同事讨论了XML声明节点(我指的是这个=><?xml version="1.0" encoding="UTF-8"?>)。
我相信,要使某个东西被称为“有效的xml”,它需要一个xml声明节点。
我的同事说,xml声明节点是可选的,因为默认编码是utf-8,版本总是1.0。这是有道理的,但标准是怎么说的?
简而言之,给定以下文件:

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

我们能这么说吗:
它是有效的XML吗?
它是有效的xml节点吗?
它是有效的xml文档吗?
非常感谢你。

最佳答案

这是:

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

不是处理指令-它是XML声明。它的目的是在开始读取文档的其余部分之前正确配置xml解析器。
它看起来像一个处理指令,但与真正的处理指令不同,它不会是解析器创建的dom的一部分。
对于“有效”xml来说,这是不必要的。有效“意味着”表示定义良好的文档类型,如DTD或模式中所述。如果没有模式或DTD,“valid”一词就没有意义。
许多人错误地使用“有效”的时候,他们真正的意思是“良好的形式”。格式良好的xml文档是遵循xml基本语法规则的文档。
文档格式良好也不需要XML声明,因为versionencoding都有默认值(分别为1.0UTF-8/UTF-16)。如果文件中存在unicode bom(字节顺序标记),它将确定编码。如果没有bom和xml声明,则假定为utf-8。
下面是一个关于编码声明和检测如何在XML文件中工作的规范线程。How default is the default encoding (UTF-8) in the XML Declaration?
对于您的问题:
它是有效的XML吗?
如果没有DTD或架构,则无法回答此问题。不过,它的形式很好。
它是有效的xml节点吗?
节点是与文档(dom)的内存表示相关的概念。这个片段可以解析为一个节点,因为它的格式很好。
它是有效的xml文档吗?
参见第1页。
您在这里混淆了一些xml概念(不用担心,这种混淆是常见的,部分原因是概念重叠,名称使用不当)。
所有这些都是从结构化数据开始的,结构化数据由名称、值和属性组成,这些数据被组织为一棵树。
XML基本上意味着一种以文本形式表示这种结构化数据的语法(它是一种“标记语言”)。这是当您将树序列化为字符串时得到的结果,它可以用于再次将字符串反序列化为树。
文档通常引用表示序列化树的字符串。它可以存储在文件中、通过网络发送或在内存中创建。
序列化和反序列化的规则定义得非常严格。可以成功反序列化为树的文档(“字符串”)称为格式良好的文档。
这种树的语义(允许的元素、元素计数和顺序、名称空间、任何数量的复杂规则,实际上)可以在所谓的dtd或模式中定义。如果一棵树遵循一组定义良好的语义,那么它就是有效的。
术语文档对象模型(dom)是指结构化数据的标准化内存表示。它是一个定义良好的API的名称,用于使用标准化方法访问此树。
节点是文档对象模型的基本数据结构。

07-27 19:35