gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:01:32 30 4
gpt4 key购买 nike

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

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/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com