格式正确的文件与经过验证的文件

Well-formed vs validated documents

我有一个简短的问题。为什么 XML 文件应该被验证而不仅仅是格式正确?

我在几个地方寻找这个问题的答案,但我没有找到一个好的答案。

"Well formed" 只是意味着您拥有所有的结束标记,您没有遗漏任何尖括号等。

OTOH - "validated" 表示 XML 已经根据 DTD 或模式进行了检查。这些允许您做一些事情,例如限制元素内容的类型或范围。或者,哪些元素是必需的,哪些是可选的等等

例如,假设您有一个名为 "age" 的元素。您可以使用您的模式来要求它是 1 - 100 范围内的非负整数。

或者,假设您有一个名为 "color" 的元素。您可以将内容限制为红色、蓝色或绿色。

关键是,您可以拥有格式正确的 XML,但它对您仍然无用,因为它未经验证并且有一堆垃圾数据。这就是为什么进行验证是个好主意。请注意,这在许多决定使用 XML 的项目中经常失败。根据我的经验,由于数据不佳,前期节省的精力在长期 运行 中会丢失。

顺便说一句 - w3schools 在模式方面有很好的 introductory tutorial

任何遵循语言规则的任意XML都是"well-formed"。

这是合式的XML

<Manager fname="John" lname="Doe">
    <Employee fname="Joe" lname="Everyman" />
</Manager>

这也是

<RandomCamelcaseText />

但这不是

<message> I'm just going to put text here and not close the tag!

无论在任何应用程序中,这始终是正确的。

但是假设我们正在编写一个应用程序,希望以 XML 的形式接收客户数据。如果我们不使用模式或 DTD 之类的东西指定数据格式,那么一个用户可能会提交这个

<Customer fname="John" lname="Doe" />

其他人可能会提交这个

<Customer>
    <fname>John</fname>
    <lname>Doe</lname>
</Customer>

另一个人可能会提交类似这样的内容

<meal>
    <spam />
    <eggs />
    <sausage meat="spam" />
</meal>

它们都是格式正确的 XML,但是其中两个以完全不同的格式表达了正确的数据类型,而第三个则完全表达了错误的数据类型。通过使用数据定义并对其进行验证,我们可以确保我们收到的数据符合我们的预期。