xmlns,xmlns:xsi,xsi:schemaLocation和targetNamespace?

smw*_*dia 43 xml xsd xml-namespaces xml-validation xsd-validation

对于以下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">
Run Code Online (Sandbox Code Playgroud)

什么的xmlns,xmlns:xsi和xsi:schemaLocation属性究竟是什么意思?它们有什么关系?有什么:用?

并且有2个网址 xsi:schemaLocation=

  1. http://maven.apache.org/POM/4.0.0 (它恰好相同xmlns但访问时出现404错误.)
  2. http://maven.apache.org/xsd/maven-4.0.0.xsd (这是一个实际的XSD文档)

如果1不存在,为什么还要把它放在那里?

kjh*_*hes 55

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

  • xmlns是XML建议书中W3C命名空间的一部分:

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

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

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

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

    在您的示例中,它声明了xsi名称空间前缀的常规绑定http://www.w3.org/2001/XMLSchema-instance,它正确设置了以下属性的使用:

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

      在你的例子中,xsi:type没有使用; 包含在这里是为了完整性xsi.

    • xsi:nil 允许在XSD可能不允许的情况下将空元素视为有效.

      在你的例子中,xsi:nil没有使用; 包含在这里是为了完整性xsi.

    • xsi:schemaLocation并xsi:noNamespaceSchemaLocation提供提示,以XML处理器为如何将XSD与XML文档相关联.xsi:schemaLocation在有命名空间时使用; xsi:noNamespaceSchemaLocation在没有命名空间时使用.

      在您的示例中,有一个名称空间,因此您可以正确使用xsi:schemaLocation,其值是空格分隔的 名称空间对和XSD-location-URI.您的示例使用命名空间,而命名空间是不需要可重复的词法命名结构.您的示例还使用了XSD-location-URI,它应该可以进行回溯.http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd

      如果您的示例未使用命名空间,则可以使用xsi:noNamespaceSchemaLocation,其值为单个XSD-location-URI,该URI提示到预期XSD的位置以及哪些应该是可检索的.

  • targetNamespace是xs:schemaXSD 的根元素上的属性,它指定XSD要管理的XML文档实例的根元素的名称空间.它必须与这些XML文档的根元素的默认或显式命名空间匹配.

  • 谢谢.因此,单个`xmlns`用于定义文档的默认命名空间.没有显式名称空间前缀的文档中的任何元素都将位于默认名称空间中.`xmlns:xxx`将定义一个非默认命名空间,在使用时必须明确地为元素添加前缀.对? (3认同)
  • 需要更多的选票,这是迄今为止我发现的最清楚的解释. (3认同)
  • 我仍然对 xsi 命名空间感到困惑。在给出的示例中,我们声明了 xsi 命名空间 (`xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"`),但不向 xml 处理器提供其架构位置。xsi 命名空间可以完全省略吗?如果没有声明 xsi 命名空间,并且给出的 `schemaLocation` 属性没有 xsi 前缀,会发生什么? (3认同)
  • 你说对了!另请注意,默认命名空间不是必需的; 你可以为`http:// maven.apache.org/POM/4.0.0`声明一个命名空间前缀,并明确地使用它. (2认同)
  • 谢谢。我现在明白了。 (2认同)

小智 9

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是一个属性schemaLocation的"http://www.w3.org/2001/XMLSchema-instance"名称空间.它包含一对值 - 名称空间URI和该名称空间的xsd-schema文件的模式位置链接.它可以包含许多值对 - 每个已定义的命名空间URI一个xsd文件.这意味着链接http://maven.apache.org/xsd/maven-4.0.0.xsd包含带有http://maven.apache.org/POM/4.0.0命名空间定义的xsd模式.