xsd和xsi有什么区别?

43

XML Schema文档XML Schema实例之间的区别是什么?

  • xmlns:xsd="http://www.w3.org/2001/XMLSchema" 表示XML Schema文档的命名空间。
  • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 表示XML Schema实例的命名空间。

请进一步阐述。


2
“到底有什么区别” - 具体的区别在于它们是没有共同元素的不同模式。一个有用的链接是 https://www.w3.org/TR/xmlschema-1/#Instance_Document_Constructions。 - GSerg
2个回答

44

xsdxsi的相似之处

  • 两者都是XML命名空间前缀,是XML命名空间的缩写。
  • 两者都是命名空间前缀,因此可以任意指定名称;其他命名空间前缀缩写同样适用。然而,这两个前缀是传统的,因此建议使用。(作为传统替代方案,也有xs。)

xsdxsi的区别

  • xsd(或 xs )前缀指的是模式命名空间http://www.w3.org/2001/XMLSchema),在XML模式(XSDs)中用于元素、属性和类型。这是可能的,因为XML Schema本身就是XML。
  • xsi 前缀指的是模式实例命名空间 http://www.w3.org/2001/XMLSchema-instance,在XML文档实例中使用,用于几个由XML Schema推荐定义的特殊属性:

参见


2
.NET的XmlSerializer似乎会引入这些命名空间前缀,即使(1)它们在生成的文档中没有被使用,以及(2)没有模式来验证它所生成的文档。我的理解是这都是按照惯例来的,虽然这有些合理,但也不完全合理。 - ChetPrickles
包含任何未使用的命名空间前缀声明都是不必要的,但并不是错误的。任何包含未使用命名空间前缀声明的序列化器都不如它本可以节俭。 - kjhughes
1
实际上,XmlSerializer使用XMLSchemaInstance命名空间通过xsi:type属性处理抽象类。还可以使用XSD.exe生成模式。我从未见过模式直接嵌入序列化的XML文件中,但如果这是可能的话,也不会让我感到惊讶。 - glopes
有一个模式命名空间,有一个实例命名空间,那么默认命名空间有什么用处? - Minh Nghĩa
1
@MinhNghĩa:通过在元素上使用 xmlns=" 默认命名空间 URI ", 可以指定 默认命名空间, 并将该元素及其子元素默认放置于给定的命名空间中。可以在任何XML文档中声明默认命名空间,包括XSD,在其中可用于避免在整个XSD中指定 xsdxs 命名空间前缀。此外,参见 XML 和 XML Schema(XSD)中的名称空间相关属性 - kjhughes

7

http://www.w3.org/2001/XMLSchema

简单版本:这是在XML Schema(XSD)中使用的命名空间。 XML模式用于描述XML实例文档中的有效内容。

稍微复杂一点的版本:这是描述XML Schema结构的XML Schema的命名空间。换句话说,这是描述自身的模式。

必须使用此模式中定义的类型编写XML Schema(XSD)。

例如:

<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="MyElement" type="xs:string" />
</xs:schema>

http://www.w3.org/2001/XMLSchema-instance

这是在XML实例文档中使用的命名空间,用于向处理它的XML解析器提供附加数据。它描述了属性xsi:schemalocation、xsi:noSchemalocation、xsi:type和xsi:nil,XML解析器可以使用它们来协助验证。

例如:

<MyElement xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
           xsi:noNamespaceSchemaLocation="MySchema.xsd">
    string
</MyElement>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接