Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XML模式导入-vs-绑定到前缀的名称空间_Xml_Xsd - Fatal编程技术网

XML模式导入-vs-绑定到前缀的名称空间

XML模式导入-vs-绑定到前缀的名称空间,xml,xsd,Xml,Xsd,我是XML模式的新手,遇到了一些模式文档,它们将大量前缀绑定到xsd:Schema根元素中的各种名称空间,并导入此类模式的子集。在XMLSchema文档的其余部分中,它们很乐意使用xsd:Schema元素中绑定的所有前缀(无论是否导入) 那么,名称空间的import与将名称空间“仅仅”绑定到前缀相比意味着什么呢 从我读的书(第66页)中: 导入用于告诉处理器您将引用来自其他名称空间的组件 在我看来,这也是绑定的作用,那么有什么区别呢 具体例子 名称空间http://www.ivoa.net/

我是XML模式的新手,遇到了一些模式文档,它们将大量前缀绑定到
xsd:Schema
根元素中的各种名称空间,并导入此类模式的子集。在XMLSchema文档的其余部分中,它们很乐意使用
xsd:Schema
元素中绑定的所有前缀(无论是否导入)

那么,名称空间的
import
与将名称空间“仅仅”绑定到前缀相比意味着什么呢

从我读的书(第66页)中:

导入用于告诉处理器您将引用来自其他名称空间的组件

在我看来,这也是绑定的作用,那么有什么区别呢

具体例子


名称空间
http://www.ivoa.net/xml/VOResource/v1.0
在上述架构中,文档都绑定到vr前缀并导入。其他名称空间仅绑定到某些前缀,而不导入。文档的其余部分使用来自vr(绑定和导入)和ssa(绑定但未导入)前缀的组件。区别是什么?

如果有对组件的引用,例如
vr:someType
,那么:

  • 您需要名称空间声明,以便处理器知道名称空间
    vr
    指的是什么

  • 您需要导入声明,以便处理器知道在哪里可以找到组件
    vr:someType

  • 这有点简化。理论上,导入并不会告诉处理器去哪里看;schemaLocation只是一个“提示”。实际上,对于大多数处理器来说,schemaLocation要么是模式文档的实际位置,要么是可以重定向(例如使用目录)到实际位置的URI


    该规范可以允许诸如
    vr:someType
    之类的引用在没有导入的情况下存在,这依赖于实现定义的机制来定位特定名称空间的模式组件。但是它不允许这样做。

    好吧,您需要学习XML基础知识来理解所有这些东西

    真正的XML名称(即元素或属性…或某个XSD组件的名称), 与complexType或group类似,它实际上不是您在特定XML文件(或XML模式)中看到的内容。你会看到这样的情况:

    xs:schema
    
    {http://www.w3.org/2001/XMLSchema}schema
    
    你认为这就是元素的名称。 但实际上,该元素(XML解析器/处理器使用的元素)的真实名称是:

    花括号中的东西表示名称空间,它是全名的有效部分

    需要名称空间是因为,例如,这里提到的元素是W3C提供和维护的XSD语言的一部分。但是,假设其他人也有某种模式(例如,某个大组织的工作模式),并希望用自己的元素来描述这些模式。更重要的是,它们可能最终在同一个XML文件中同时包含两个元素(即它们自己的元素和W3C元素)。XML解析器如何区分它们

    在这里,名称空间有帮助。它们允许用其他东西扩展本地XML名称(在XML中使用),一些额外的字符串足够长,以确保它们在地球上的任何XML文件中总是相同的。这些长字符串称为名称空间URI,这就是您在上面的花括号中看到的

    但您是否愿意让您的XML文件中填充以下名称:

    xs:schema
    
    {http://www.w3.org/2001/XMLSchema}schema
    
    你在那里什么都看不懂,对吗

    XML提供了一种解决该问题的方法。 您只需要为每个XML名称声明一些快捷方式,而不是编写整个名称空间URI。该快捷方式称为名称空间前缀,您可以使用一个特殊的绑定属性
    xmlns:…
    来声明它,例如:

    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    
    这里
    xs
    是前缀(表示名称空间)。现在,你可以在任何地方简单地写下:

    xs:schema
    
    名称空间前缀本身是本地的(XML文件的本地)。 您可以同样使用任何其他字符串,例如“xsd”:

    xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    
    然后写

    xsd:schema
    
    根XML元素通常包含给定XML中使用的所有命名空间绑定的声明(不过,这不是必需的;绑定对于声明它的XML元素的内容是有效的)

    当然,一些XML文件(和XSD)可能包含以后从未使用过的名称空间绑定。这不是一个错误。但这是一种不整洁的工作(与程序中未使用的变量相同)


    现在,导入
    元素的作用是什么?它只是将一些外部XML模式导入到您的模式中。导入意味着现在您可以在自己的声明中使用该导入模式中定义的任何全局组件

    但请记住,您总是使用完整的XML名称(即本地名称+命名空间URI),因为模式处理器会这样做。导入的外部架构描述了某些不同命名空间中的元素(组件)。如果要引用这些组件,需要告诉XML处理器它们的名称空间,这可以通过绑定到XML中导入的名称空间URI的某个名称空间前缀来实现

    import
    元素有两个属性:

    <xs:import namespace="http://www.ivoa.net/xml/VOResource/v1.0"
               schemaLocation="http://www.ivoa.net/xml/VOResource/v1.0"/>
    
    
    
    namespace
    属性指定导入内容的名称空间URI。实际上,
    import
    元素应该只导入不同的名称空间(不是您用模式描述的名称空间的一部分;因此还有另一个XSD元素:
    include
    )。因此,您使用
    import
    所做的就是导入名称空间

    schemaLocation
    属性告诉模式解析器导入的模式(XSD)文件的物理位置。这是可选属性。一些XML模式软件可能保存描述一些重要名称空间(特别是W3C维护的名称空间)的XML模式的本地副本。那么,等等