xmlns、xmlns:xsi、xsi:schemaLocation和targetNamespace是什么?

88
以下是需要翻译的内容:

对于以下的XML片段:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
xmlnsxmlns:xsixsi:schemaLocation属性的确切含义是什么?它们之间有什么关系?:是什么意思?
xsi:schemaLocation=中有2个URL:
  1. http://maven.apache.org/POM/4.0.0(与xmlns相同,但访问时会出现404错误)
  2. http://maven.apache.org/xsd/maven-4.0.0.xsd(这是一个实际的XSD文档)
如果第一个URL不存在,为什么还要把它放在那里?
2个回答

104

XML和XML Schema(XSD)中与命名空间相关的属性

  • xmlnsW3C Namespaces in XML Recommendation的一部分:

    xmlns前缀仅用于声明命名空间绑定,根据定义它绑定到命名空间名称http://www.w3.org/2000/xmlns/

    在您的示例中,它声明了http://maven.apache.org/POM/4.0.0是Maven项目元素的默认命名空间。

  • xmlns:xsi 声明了XSD中使用的核心命名空间http://www.w3.org/2001/XMLSchema-instance的标准命名空间前缀(xsi)

    XML Schema: Structures还定义了用于直接在任何XML文档中使用的几个属性。这些属性位于不同的命名空间中,该命名空间的命名空间名称为http://www.w3.org/2001/XMLSchema-instance。为简洁起见,在本规范中的文本和示例使用前缀xsi:来代表后面的命名空间;实际上,任何前缀都可以使用。

    在您的示例中,它声明了xsi命名空间前缀惯例绑定到http://www.w3.org/2001/XMLSchema-instance,这样适当地设置了以下属性的使用:

    • xsi:type 允许XML实例直接关联元素类型信息,而不是通过XSD。详情请参见如何使用XSI类型在XSD中限制XML元素的值?

      在您的示例中,未使用xsi:type;这里包含了xsi的完整性。

    • xsi:nil 允许将空元素视为有效,而XSD可能不允许。

      在您的示例中,未使用xsi:nil;这里包含了xsi的完整性。

    • xsi:schemaLocationxsi:noNamespaceSchemaLocation 提供XML处理器如何将XSD与XML文档关联的提示。 当有命名空间时,请使用xsi:schemaLocation; 当没有命名空间时,请使用xsi:noNamespaceSchemaLocation

    • 在你的例子中,存在一个命名空间,因此你正确地使用了 xsi:schemaLocation,它的值是一对用空格隔开的命名空间和XSD位置URI。你的例子使用了命名空间http://maven.apache.org/POM/4.0.0,命名空间是词法命名结构,并不一定可检索。你的例子还使用了可检索的XSD位置URIhttp://maven.apache.org/xsd/maven-4.0.0.xsd
      如果你的例子没有使用命名空间,那么你将使用xsi:noNamespaceSchemaLocation,它的值是一个XSD位置URI,提示该XSD的位置,并且应该是可检索的。 targetNamespace是XSD根元素xs:schema上的属性,指定该XSD所管理的XML文档实例的根元素的命名空间。它必须与这些XML文档根元素的默认或显式命名空间相匹配。

8
谢谢。因此,单个 xmlns 用于定义文档的默认命名空间。文档中没有显式命名空间前缀的任何元素都将位于默认命名空间中。xmlns:xxx 将定义非默认命名空间,必须在使用时将其显式地添加到元素前缀中。对吗? - smwikipedia
4
明白了!还要注意,不是必须有默认命名空间。你可以声明一个命名空间前缀来代替 http://maven.apache.org/POM/4.0.0,然后明确使用它。 - kjhughes
2
谢谢。我现在明白了。 - smwikipedia
4
需要更多的赞,这是目前为止我找到的最清晰的解释。 - Toby
3
我仍然对xsi命名空间感到困惑。在所给的示例中,我们声明了xsi命名空间(xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"),但没有为xml处理器指定其模式位置。xsi命名空间是否可以完全省略?如果未声明xsi命名空间并且使用schemaLocation属性而没有xsi前缀,会发生什么? - jmrah
显示剩余3条评论

25

xmlns 定义了默认的命名空间,指定在项目节点内且没有命名空间别名的所有节点默认位于 http://maven.apache.org/POM/4.0.0 命名空间中。

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 定义了命名空间 http://www.w3.org/2001/XMLSchema-instance 并给它一个新的别名 xsi

xsi:schemaLocation"http://www.w3.org/2001/XMLSchema-instance" 命名空间的 schemaLocation 属性。它包含了一对值——该命名空间的名称空间URI和xsd-schema文件的模式位置链接。它可以包含多个值对——每个定义的命名空间URI一个xsd文件。这意味着链接 http://maven.apache.org/xsd/maven-4.0.0.xsd 包含了定义 http://maven.apache.org/POM/4.0.0 命名空间的xsd模式。


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