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模式头文件和命名空间配置全部内容,希望文章能够帮你解决XML模式头文件和命名空间配置所遇到的程序开发问题。

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您喜欢寻找一群志同道合、互帮互助的学习伙伴,可以点击下方链接加入:
编程之家官方1群
编程之家官方2群
编程之家官方3群
编程之家官方4群

相关文章

猜你在找的XML相关文章

引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满足人的生产生活需要而产生的。具体到小小的一个手机,里面蕴含的技术也是浩如烟海,是几千年来人类科技的结晶,单个人穷其一生也未必能掌握其一角。不过个人一直认为基本的技术和思想是放之四海而皆准的,许多技术未必需要我们从头到尾再研究一遍,我们要做的就是站在巨人的肩膀上,利用其成果来为人们的需求服务。 随着移动互联网时代的大潮,越来越多
Writer:BYSocket(泥沙砖瓦浆木匠) 微博:BYSocket 豆瓣:BYSocket Reprint it anywhere u want. 文章Points: 1、不认识到犯错,然后得到永久的教训。 2、认识JAXB 3、代码实战   1、不认识到犯错,然后得到永久的教训。   也不是所谓的教训吧,真正的教训来自于对错误的剖析理解很深刻。然后有种“吃一堑,长一智”的感觉才叫教训。近日
http://blog.jobbole.com/79252/ 引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满足人的生产生活需要而产生的。具体到小小的一个手机,里面蕴含的技术也是浩如烟海,是几千年来人类科技的结晶,单个人穷其一生也未必能掌握其一角。不过个人一直认为基本的技术和思想是放之四海而皆准的,许多技术未必需要我们从头到尾再研究一遍,我们要做的就是站在巨人的肩膀上,利用
(点击上方公众号,可快速关注) 公众号:smart_android 作者:耿广龙|loonggg 点击“阅读原文”,可查看更多内容和干货 昨天我们学习了自定义带图片和文字的ImageTextButton,非常简单,我承诺给大家要讲一下用自定义属性的方式学习真正的实现自定义控件,在布局文件中使用属性的方式就需要用到attr.xml这个文件,以前很多同学问我这个是干什么的,现在学了这篇内容,你就差不多
引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满足人的生产生活需要而产生的。具体到小小的一个手机,里面蕴含的技术也是浩如烟海,是几千年来人类科技的结晶,单个人穷其一生也未必能掌握其一角。不过个人一直认为基本的技术和思想是放之四海而皆准的,许多技术未必需要我们从头到尾再研究一遍,我们要做的就是站在巨人的肩膀上,利用其成果来为人们的需求服务。 随着移动互联网时代的大潮,越来越多
 (点击上方公众号,可快速关注) 来源: Long Luo 的博客 链接:http://longluo.github.io/blog/20141031/master-XML-JSON-and-how-to-aprse-them-in-10-minutes/ 引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满足人的生产生活需要而产生的。具体到小小的一个手机,里面蕴含的技术也是浩
接上文 2.4 如何解析JSON? Android JSON所有相关类,都在org.json包下。 包括JSONObject、JSONArray、JSONStringer、JSONTokener、JSONWriter、JSONException。 <1>. 常见方法 目前JSON解析有2种方法,分别是get和opt方法,可以使用JSON 那么使用get方法与使用opt方法的区别是? JsonObj
原文出处:  Long Luo 的博客(@Long_Luo)   引言 NOKIA 有句著名的广告语:“科技以人为本”。任何技术都是为了满足人的生产生活需要而产生的。具体到小小的一个手机,里面蕴含的技术也是浩如烟海,是几千年来人类科技的结晶,单个人穷其一生也未必能掌握其一角。不过个人一直认为基本的技术和思想是放之四海而皆准的,许多技术未必需要我们从头到尾再研究一遍,我们要做的就是站在巨人的肩膀上,
微信公众号搜索 “ 程序精选 ” ,选择关注!
微信公众号搜 "程序精选"关注