XSD:命名空间和默认命名空间之间的区别是什么

Ang*_*ito 4 xml xsd namespaces xml-namespaces

也许问题的标题是误导性的,那是因为我无法用一句话来解释我的问题.

w3school教程中,有这个例子:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3schools.com"
           xmlns="http://www.w3schools.com"
           elementFormDefault="qualified">
    ...
    ...
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

提交人称:xmlns:xs="http://www.w3.org/2001/XMLSchema"意味着:

模式中使用的元素和数据类型来自" http://www.w3.org/2001/XMLSchema "命名空间.它还指定来自" http://www.w3.org/2001/XMLSchema "命名空间的元素和数据类型应以xs为前缀.

但是,提交人还说,这targetNamespace="http://www.w3schools.com"意味着:

此架构定义的元素(注释,to,from,heading,body.)来自" http://www.w3schools.com "命名空间.

我在理解前面的段落时遇到了问题.第一个声明元素来自http://www.w3.org/2001/XMLSchema命名空间,尽管第二个段落声明元素来自http://www.w3schools.com命名空间.

在我看来,这两句话相互冲突.

你能告诉我哪一个是正确的吗?每个人的真正含义是什么?

我很感激你的时间.

问候,

hel*_*cha 9

默认名称空间,限定名称和前缀

默认命名空间是一个不映射到任何前缀之一.您使用以下方式声明它:

xmlns="a-string-that-is-usually-an-uri"
Run Code Online (Sandbox Code Playgroud)

如果在XML文件中有这样的声明,则任何未加前缀的元素都将属于该命名空间.未加前缀的属性始终不属于任何名称空间.

您可以在XML文档中具有多个名称空间声明,但每个范围中只有一个默认名称空间.您也不需要任何默认命名空间.范围由元素本身及其后代组成.在下面的文档中,有两个默认名称空间.该ns2命名空间替换ns1它在其后代中声明的元素:

<root xmlns="ns1">
    <text>This is ns1</text>
    <child xmlns="ns2">
        <text>This is ns2</text>
    </child>
</root>
Run Code Online (Sandbox Code Playgroud)

<text>上面的文档中有两个元素.实际上它们是完全不同的元素,因为每个元素都属于不同的命名空间.它们具有相同的本地名称,但它们的限定名称不同.

如果您有相同名称空间的声明,例如:

xmlns:p="a-string-that-is-usually-an-uri"
Run Code Online (Sandbox Code Playgroud)

您正在使用前缀映射命名空间,该前缀p可供上下文中的任何元素使用(考虑格式良好的文档,不一定有效).对于有效文档,作为命名空间一部分的元素应该由它限定,或者作为声明默认命名空间的元素的无前缀的后代(或self),或者作为声明的元素的前缀后代(或self).映射到该前缀的名称空间.前缀也可用于限定属性.

通过使用前缀,您可以在根元素处拥有所有声明,并且限定元素可以混合使用:

<root xmlns:p="ns1" xmlns:q="ns2" xmlns="ns0">
    <p:text>This is ns1</p:text>
    <q:child xmlns="ns2">
        <q:text>This is ns2</q:text>
        <p:text>This is ns1 again!</p:text>
        <text>This is ns0</text>
    </q:child>
</root>
Run Code Online (Sandbox Code Playgroud)

上面的每个<text>元素都是不同命名空间的一部分.

花一些时间阅读本指南:了解XML命名空间.它很简短,如果你仔细阅读它,你肯定会理解XML中的命名空间如何工作得很好.如果您愿意,还可以阅读XML命名空间规范,这是官方文档.

在XSD中定位名称空间

关于您正在阅读的教程.这个文件:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3schools.com"
           xmlns="http://www.w3schools.com"
           elementFormDefault="qualified">
    ...
    ...
</xs:schema>
Run Code Online (Sandbox Code Playgroud)

两个名称空间声明和一个目标名称空间声明.由于它也是一个模式,因此它包含属于目标名称空间的类型定义.这可能会令人困惑,因为架构是一个XML文档,它使用XML声明其他XML文档的规则.将XSD文档视为纯XML文档,您有一个名称空间映射到前缀,另一个名称空间是默认名称空间.您还可以合法使用不同的前缀:xs

<abc:schema xmlns:abc="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3schools.com"
           xmlns:xyz="http://www.w3schools.com"
           elementFormDefault="qualified">
    <abc:complexType name="MyType"> ...</abc:complexType>
    <abc:element name="myElementOne" type="xyz:MyType" />
    <abc:element name="myElementTwo" type="abc:string" />
</abc:schema>
Run Code Online (Sandbox Code Playgroud)

如果仔细查看上面的示例,您可能会看到关联:

  1. schema,complexTypeelement元素,再加上string类型都属于http://www.w3.org/2001/XMLSchema命名空间.
  2. 模式中没有属于http://www.w3schools.com命名空间的元素或属性,因为这是一个模式,它实际上定义了这些元素.
  3. MyType复杂类型是部分http://www.w3schools.com命名空间.这是因为它是在模式中声明的targetNamespace,而模式是在模式中声明的http://www.w3schools.com.由于该命名空间被映射到xyz前缀,prefix因此在引用它时需要它.这是type第一个元素的属性中发生的事情,type第二个元素的属性引用命名空间的string类型的方式相同http://www.w3.org/2001/XMLSchema.

您也可以像这样编写上面的架构.这没有区别:

<schema xmlns="http://www.w3.org/2001/XMLSchema"
           targetNamespace="http://www.w3schools.com"
           xmlns:xyz="http://www.w3schools.com"
           elementFormDefault="qualified">
    <complexType name="MyType"> ...</complexType>
    <element name="myElementOne" type="xyz:MyType" />
    <element name="myElementTwo" type="string" />
</schema>
Run Code Online (Sandbox Code Playgroud)

现在请注意,一个默认的命名空间,它的http://www.w3.org/2001/XMLSchema,因此,所有类型和命名空间的元素都没有前缀.

但是,最好遵循约定并将前缀映射到XSD名称空间(通常xsxsd).

关于冲突的句子

实际上,他们没有冲突.但它们写得不好(或许可能是在原始背景下).第一个:

模式中使用的元素和数据类型来自" http://www.w3.org/2001/XMLSchema "命名空间.它还指定来自" http://www.w3.org/2001/XMLSchema "命名空间的元素和数据类型应以xs为前缀.

将XSD文档视为常规XML文件.在任何XML文件中,根元素中的命名空间声明(如xmlns ="ns1")声明未加前缀的元素来自ns1 默认命名空间.在由语句中描述的情况下,作者是指所有的前缀的元素(如element,complexType,的simpleType ,序列) and types (such as,整数,小数) because thexs`前缀映射到XSD命名空间.作者在谈论元素和类型用于在XML文件中, 没有定义的.

下一句是关于targetNamespace,这是特定于XSD规范的属性.它声明了所有类型的命名空间:

targetNamespace ="http://www.w3schools.com"表示此架构定义的元素(note,to,from,heading,body.)来自" http://www.w3schools.com "命名空间.

这是指您为类型和元素指定的名称.当您创建声明该命名空间的实例时,您将使用以下元素:

<note xmlns="http://www.w3schools.com">...</note>
Run Code Online (Sandbox Code Playgroud)

要么

<x:note xmlns:x="http://www.w3schools.com">...</x:note>
Run Code Online (Sandbox Code Playgroud)

但是在XSD中你定义它们.你甚至都不需要声明xmlns="http://www.w3schools.com"的模式,如果你从来没有参考(使用属性,如type,ref等),给你里面创建的任何其他类型或元素.