XML模式头文件和命名空间配置

前端之家收集整理的这篇文章主要介绍了XML模式头文件和命名空间配置前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
从DTD迁移到XSD,由于某种原因,转换是一个颠簸的过程.我了解如何在< xs:schema>内部定义模式根标签,但越过标题&对我来说,命名空间声明的东西被证明是特别令人困惑的.

我一直试图遵循W3S的精心设计的教程,但即使这个教程似乎假设了很多知识.

我想我在找什么是国王的英文解释,哪些属性做什么,他们去哪里,为什么:

> xmlns
> xmlns:xs
> xmlns:xsi
> targetNamespace
> xsi:schemaLocation

在某些情况下,我看到这些元素/属性的不同变体,例如xsi似乎有两种不同的符号,如xsi:schemaLocation =“…”和xs:import schemaLocation =“…”.

我猜所有这些轻微的变化,我似乎不能做出头或尾的每一个这些.提前感谢带来任何澄清这个混乱!

您需要了解的第一件事是XML命名空间.如果您有浪费时间,可以阅读 the specification.我发现这是与XML相关的更清晰的规范之一.没关系,如果你不明白它所说的一切,这是一个很好的基础.但这是一个快速的破坏.

XML元素和属性有一个名称.当您看到< test att =“hello”/>时,您正在查看名称为“test”的元素,其中我们有一个名称为“att”的属性.但这不是真正的整个故事…

XML是一种允许您混合来自不同标记语言的内容的语法.例如,当使用XSLT将XML文档转换为XHTML页面时,您将处理至少三种在XML中定义的标记语言:输入文档的XSLT和XHTML.如果每个人保留自己的元素/属性名称,并且不允许任何冲突,这样的混合将变得相当困难.

输入XML命名空间. XML命名空间定义了一个“球体”,其中元素和属性名称具有实际的语义.元素“模板”在XSLT命名空间中具有明确的含义.元素“complexType”在XML Schema命名空间中具有明确的含义.如果您希望使用自己的标记语言使用XML,那么这是可能的,只要您在不同的命名空间中这样做.

为了确保命名空间是唯一的,您需要提供一些唯一的标识符.该规范解决了URI的使用,通常以HTTP URL的形式.原因很简单:这样的URL往往是很好的唯一标识符.但是,这也是一个很常见的混乱原因,因为人们认为URL真正具有意义或将在XML处理过程中通过网络进行访问.非常了解,情况并非如此!该URL不需要指向任何现有的资源.它不会通过任何转换或被解决到一个网络地址.即使两个URL指向完全相同的东西,当它们与一个字符不同时,它们被认为是不同的命名空间.命名空间标识符只是一个字符串,并且区分大小写.而已.

随着命名空间的引入,XML元素或属性名称突然由两部分组成:名称空间和本地名称. < test />中的“test”只是当地的名字.所谓的“完全限定名称”由命名空间和本地名称的一种隐形组合组成.有时使用{namespace URI} local-name的符号,但这只不过是约定.

所以现在我们需要能够在XML文档中使用命名空间.为了声明一个命名空间,XML具有硬编码机制.它使用特殊字符串xmlns来进行命名空间声明.它可以通过以下两种方式之一完成:将命名空间绑定到前缀,或将其声明为默认命名空间.

当绑定到前缀时,表单是这样的:xmlns:prefix =“namespace URI”.以下是XML文档中的示例:

<foo:root xmlns:foo="http://www.foo.com">
    <foo:test />
</foo:root>

我们现在已将名称空间http://www.foo.com绑定到前缀foo.无论这个前缀放置在元素或属性名称的前面,我们都在声明它们是该命名空间的一部分.

这里需要注意的是,实际的前缀意味着绝对没有.以下XML文档在语义上完全相同:

<bar:root xmlns:bar="http://www.foo.com">
    <bar:test />
</bar:root>

前缀只是一种方便的方式来表示命名空间.它使我们无需每次都完全使用URI.

接下来是默认的命名空间.可以使用xmlns =“namespace URI”声明默认命名空间.你可以抽象地认为这是将命名空间绑定到空的前缀.再次是同一个XML文档,但这次没有前缀:

<root xmlns="http://www.foo.com">
    <test />
</root>

这是一个更方便使用.那么为什么要有前缀呢?当我们混合来自不同命名空间的内容时,他们开始扮演一个角色:

<root xmlns="http://www.foo.com">
    <so:test xmlns:so="https://stackoverflow.com" />
</root>

这一次它是一个不同的XML文档.我们的根元素在http://www.foo.com命名空间中,但测试元素位于https://stackoverflow.com,因为我们已经绑定到这样的前缀,并在测试中使用它.

您还在这里注意到,可以在XML文档中的任何元素上声明命名空间.该声明的范围(和绑定到前缀,如果适用)然后成为该元素及其内容.

有时可能会变得混乱,因为声明可能会互相重叠.检查这个文件

<root xmlns="http://www.foo.com">
    <test />
    <so:test xmlns:so="http://www.stackoverflow.com" xmlns="http://www.bar.com">
        <test />
    </so:test>
</root>

花点时间找出每个元素的命名空间…这是一个很好的练习.

root在命名空间http://www.foo.com.第一个测试元素也在该命名空间中,因为我们没有使用前缀,但我们在该默认命名空间的范围内.具有前缀的第二个测试元素位于命名空间http://www.stackoverflow.com中,因为这是我们绑定前缀的.

那么那里就是第三个最里面的测试元素.它有什么命名空间?它没有前缀,因此它必须在默认的命名空间中.但是,我们更改了第二个测试元素中的默认命名空间!所以现在最内层的元素属于http://www.bar.com命名空间,而不是http://www.foo.com.

困惑了吗记住以下几点:

>命名空间只是一个字符串. URI被用作具有唯一标识符的便利方式.
>一个前缀用于表示一个命名空间,但是它的名字并不意味着什么.把它当成一个占位符.
>您可以设置一个默认的命名空间.其范围内没有前缀的所有元素都将成为其中的一部分.

唷.现在,到W3C XML Schema.这一切如何与之相关?

那么,对于初学者来说,XML Schema本身就是一种在XML中定义的标记语言.因此,它获得自己的命名空间是理所当然的.而这个命名空间正式http://www.w3.org/2001/XMLSchema.如果你把S写成小写,那就错了.开始看到为什么有些人真的讨厌命名空间?

以下三个文件完全一样:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
</xsd:schema>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
</xs:schema>

<schema xmlns="http://www.w3.org/2001/XMLSchema">
</schema>

所有重要的是我们正在使用XML Schema命名空间中的东西.然而,作为惯例,人们倾向于在XML模式中使用前缀xs或xsd.

当我们有一个XML文档时,我们可能希望指定它所在的模式的位置.多个模式可能与XML文档相关,因为我们已经说明了可以将XML混合使用.为了说XML文档是模式的一个实例,再次有一个特殊的命名空间可用:http://www.w3.org/2001/XMLSchema-instance.按照惯例,我们倾向于将这个命名空间绑定到前缀xsi.但是再一次,这不是强制性的.

在该模式实例命名空间中定义了几个属性.其中有schemaLocation和noNamespaceSchemaLocation.看看这个文件

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.foo.com/schema">
</root>

那里发生了什么?首先我们说我们将绑定前缀xsi命名为http://www.w3.org/2001/XMLSchema-instance.那么我们在这个命名空间中使用了一个属性:noNamespaceSchemaLocation.该属性告诉我们模式所在的位置,以验证文档中不在任何特定命名空间中的那些部分.以下XML文档在语义上完全相同:

<root xmlns:huh="http://www.w3.org/2001/XMLSchema-instance" huh:noNamespaceSchemaLocation="http://www.test.com/schema">
</root>

记住,前缀名没有意义.他们是占位符.那么那个noNamespaceSchemaLocation属性是什么呢?基本上,它告诉我们我们可以在哪里找到一个模式.现在与命名空间URI相反,这绝对是可以用来从网络或本地存储中获取东西的东西.对文档中声明的模式进行验证的XML处理器可能会尝试获取它.

那就是这样一个事实,叫做noNamespaceSchemaLocation.模式定义了一个“目标命名空间”.这是什么命名空间的定义的元素和属性是它的一部分.但目标名称空间可能会被省略.在这种情况下,我们有一个没有命名空间的XML文档的架构.这样的模式可以使用noNamespaceSchemaLocation来引用.

在许多情况下,一个模式实际上将定义一个命名空间.为了说明哪个模式属于哪个命名空间,我们可以使用http://www.w3.org/2001/XMLSchema-instance命名空间中的另一个属性:schemaLocation.该属性可以包含命名空间URI和模式URI的对(由空格分隔).假设我们有位于http://www.myschemas.com/foo-schema的命名空间http://www.foo.com的模式.那么我们可以说如下:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.foo.com http://www.myschemas.com/foo-schema">
</root>

以下是多个命名空间位置对的示例:

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.foo.com http://www.myschemas.com/foo-schema http://www.bar.com http://www.randomschemas.com/bar-schema">
</root>

您需要记住的是http://www.w3.org/2001/XMLSchema-instance的东西是用于模式实例的XML文档.命名空间http://www.w3.org/2001/XMLSchema是用于定义模式本身的命名空间.

所以现在我们到了我们的脖子上的URI和奇怪的属性有特殊的意义.这就是命名空间的东西:它们看起来很复杂,直到你知道它们是多么简单.只要密切关注什么前缀绑定到什么命名空间URI,并且知道该URI定义了什么.

另外还有两件关于我需要解决的问题的模式:xs:import和xs:include.注意我在这里使用xs前缀约定,因为我们在谈论W3C XML Schema.

include元素可用于将模式与相同的目标命名空间相结合.基本上,它允许我们将模式模块化成较小的部分并将它们放在一起.

导入元素的排序相同,但对于具有不同目标命名空间的模式.这允许我们结合不同标记语言的模式.

所以要回顾一下:

> xmlns:用于指定默认的命名空间.
> xmlns:prefix:用于将命名空间绑定到前缀.
> http://www.w3.org/2001/XMLSchema:XML Schema的命名空间.按惯例通常绑定到前缀xs,但这不是强制性的,也不是自动完成的.
> http://www.w3.org/2001/XMLSchema-instance:定义一些有用的声明XML文档是模式实例的详细信息的命名空间.按惯例往往绑定到前缀xsi,也不是自动完成的.
> targetNamespace:可以在XML Schema(在根元素上)使用的属性,用于指定哪个命名空间是模式定义.
> schemaLocation:由命名空间http://www.w3.org/2001/XMLSchema-instance定义的属性之一,用于指示可以为一个或多个命名空间找到一个或多个模式.

我的最后建议:找到一些方便的方式来验证文档,反对模式,玩一下.实验命名空间,包括和导入.使用多个命名空间制作文档,并尝试使用范围.

之后,检查XML本身的规范,XML命名空间和XML Schema.这是硬核阅读,但是如果你通过它,你会得到一个理解,许多人仍然似乎错过了多年的使用XML.最终这一切都会有意义.

祝你好运!

猜你在找的XML相关文章