xml - XSD : what is the difference between the namespace and the default namespace

标签 xml namespaces xsd xml-namespaces

也许问题的标题具有误导性,那是因为我无法用一行语句来解释我的问题。

w3school tutorial ,有这个例子:

<?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>

作者曾声明:xmlns:xs="http://www.w3.org/2001/XMLSchema"方法:

the elements and data types used in the schema come from the "http://www.w3.org/2001/XMLSchema" namespace. It also specifies that the elements and data types that come from the "http://www.w3.org/2001/XMLSchema" namespace should be prefixed with xs.



不过,作者也表示targetNamespace="http://www.w3schools.com"方法:

the elements defined by this schema (note, to, from, heading, body.) come from the "http://www.w3schools.com" namespace.



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

在我看来,这两个句子相互冲突。

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

我很感激你的时间。

问候,

最佳答案

默认命名空间、限定名称和前缀

默认命名空间是未映射到任何前缀的命名空间。你声明它使用:

xmlns="a-string-that-is-usually-an-uri"

如果您在 XML 文件中有这样的声明,则任何不带前缀的元素都将属于该命名空间。无前缀的属性总是不属于任何命名空间。

在一个 XML 文档中可以有多个命名空间声明,但在每个范围内只能有一个默认命名空间。您也不需要任何默认命名空间。作用域由元素本身及其后代组成。在下面的文档中,有两个默认命名空间。 ns2 命名空间替换了声明它的元素及其后代中的 ns1:
<root xmlns="ns1">
    <text>This is ns1</text>
    <child xmlns="ns2">
        <text>This is ns2</text>
    </child>
</root>

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

如果您有相同命名空间的声明,例如:
xmlns:p="a-string-that-is-usually-an-uri"

您正在使用前缀 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>

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

花一些时间阅读本指南: Understanding XML Namespaces 。它很短,如果您仔细阅读,您肯定会理解 XML 中的 namespace 如何工作得很好。如果您愿意,还可以阅读官方文档 XML Namespaces specification

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>

有两个命名空间声明和一个目标命名空间声明。由于它也是一个模式,它包含属于目标命名空间的类型定义。这可能会令人困惑,因为模式是一个 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>

如果您仔细查看上面的示例,您可能会看到以下关联:
  • schemacomplexTypeelement 元素,加上 string 类型都属于 http://www.w3.org/2001/XMLSchema 命名空间。
  • 架构中没有属于 http://www.w3schools.com 命名空间的元素或属性,因为这是一个架构并且它实际上定义了这些元素。
  • MyType 复杂类型是 http://www.w3schools.com 命名空间的一部分。这是因为它是在架构中声明的,并且架构的 targetNamespacehttp://www.w3schools.com 。既然那个命名空间映射到了xyz前缀,那么你引用它的时候就需要prefix它就是第一个元素的type属性中发生的事情,同理第二个元素的type属性引用67910的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>
    

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

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

    关于矛盾的句子

    实际上,它们并不冲突。但是它们写得并不好(它们可能是在它们的原始上下文中)。第一个:

    the elements and data types used in the schema come from the "http://www.w3.org/2001/XMLSchema" namespace. It also specifies that the elements and data types that come from the "http://www.w3.org/2001/XMLSchema" namespace should be prefixed with xs.



    将 XSD 文档视为常规 XML 文件。在任何 XML 文件中,根元素中的命名空间声明(例如 xmlns="ns1")声明未加前缀的元素来自 ns1 默认命名空间。在句子所描述的情况下,作者是指所有带前缀的元素(例如 elementcomplexType 、 simpleType , 序列 ) and types (such as 字符串 , 整数 0x1045 映射到十进制的 X71045 的 X71045 的十进制命名空间中的 X70145和类型 在 XML 文件中使用了 ,未定义。

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

    targetNamespace="http://www.w3schools.com" means that the elements defined by this schema (note, to, from, heading, body.) come from the "http://www.w3schools.com" namespace.



    这是指您分配给类型和元素的名称。当您创建一个声明该命名空间的实例时,您将使用这些元素:
    <note xmlns="http://www.w3schools.com">...</note>
    

    或者
    <x:note xmlns:x="http://www.w3schools.com">...</x:note>
    

    但是在 XSD 中,您正在定义它们。如果您从不引用(使用 ) because thetargetNamespace 等属性)到您在其中创建的任何其他类型或元素,您甚至不需要在架构中声明 xmlns="http://www.w3schools.com"

    关于xml - XSD : what is the difference between the namespace and the default namespace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24313849/

    相关文章:

    C++ : namespace conflicting declaration error

    C#、XML : move second namespace to root element

    java - 在 Java 中检索 XML 文件的节点列表

    java - 读取 xml 时避免重复规则

    clojure - 为什么 Clojure 在创建新的命名空间后不提供标准库?

    php - 使用命名空间前缀在 PHP 中获取 XML 值

    java - XJC xs :choice inheritance

    xml - 在 emacs XML 模式下,如何漂亮地格式化 XML 模式文件?

    xml - 非常简单的 XSL/XPath 健全性检查

    php - 如果 xsi :nil = true (XML) 如何返回 NULL