为什么XML类型安全?


30

他们为什么说XML提供类型安全性,以及它如何在XML本身中表达?

与JSON(例如,据我所知)不是类型安全的JSON有何不同?

Answers:


36

由于XML架构定义(XSD)。

使用XML,可以有一个描述模式的附加文件。例如,它表示元素/a/b是一个数组并包含1到10个元素,或者该元素/a/c是整数。您可以在此处找到XSD的示例。

许多语言支持通过 XSD验证给定的XML文件。例如,.NET应用程序可能会从不受信任的来源请求XML文件,并检查其是否与XSD匹配;例如,然后,它可以将其保存到Microsoft SQL Server数据库,该数据库又可以包含XSD并再次进行检查(以确保可以访问该数据库的所有客户端都可以使用)。

XSD不是唯一的语言。

  • 如果您已经完成了Web开发,您肯定会听说过文档类型定义(DTD),它是一种定义XML结构的标记语言,特别用于验证与HTML相关的内容。尽管它不能完成XSD可以做的所有事情,例如确保元素或属性包含整数,但是它仍然可以执行一堆结构检查。

  • 与其他语言相比,RELAX NG具有相对简单的优点,并且可以以比XML更紧凑的形式编写。

  • Schematron是另一种“基于规则的验证语言,用于对XML树中的模式是否存在进行断言”(维基百科),并且基于XPath断言提出了一种略有不同的方法。

类似的JSON 倡议并不流行(尤其是,我相信,在以Microsoft为中心的企业界)。原因之一是JSON用于数据结构相当基本(例如,可以表示为树,而无需属性)并且不必进行验证的情况。一个很好的例子是动态类型语言使用的REST API:

  • 客户非常容易快速实现,
  • 相信API不会更改,
  • 客户可以轻松地处理需要验证的特定叶子(例如,检查/something/percentage是否为实际数字并且在0..100范围内)。

20

XML 可以是类型安全的,因为XSD架构可以声明元素的数据类型。根据XSD架构验证的文档可以保证符合预期的类型。但是XML格式不需要具有架构,因此文档不是仅靠XML就能自动键入安全的。

实际上也存在JSON的模式语言,因此可以输入安全的JSON。但是它很少使用,因此通常JSON不是类型安全的。


2
使用与XSD等效的JSON名称或链接,您的答案会更好。
DougM 2015年

1
顺便说一句:到目前为止,XML模式并不是XML的唯一模式定义语言。还有Schematron,RelaxNG,当然还有不错的SGML DTD。
约尔格W¯¯米塔格

还请记住,即使使用架构,XML也不是类型安全的。可以指定一个元素具有“任何”类型的内容。尽管可以说这是一种类型安全性(我不在乎,什么都有效),但同时无法执行验证:它本质上是“变量”类型。

3

在计算机科学中,类型安全性是编程语言阻止或防止类型错误的程度。

类型安全性不是绝对属性。它不是布尔值。语言(而XML和JSON 语言)允许并防止不同类型的错误和错误。例如,您可以错误命名元素。但是您不能跳过必需的语法元素,例如结束标记和花括号。

纯XML和JSON在类型安全(或类型不安全)方面几乎相同。有效的XML / JSON字符串具有一定的语法和语义结构,但是对于应用程序而言,这几乎是远远不够的。应用程序不仅具有任何结构,而且具有特定结构。

XML带有XML模式定义(XSD),这是一种灵活而强大的方法,可以根据模式验证给定的XML文档。根据上面给出的定义,这提供了很多类型安全性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.