XML验证器如何知道在哪里可以找到XML文档中声明的模式实例,以便解析和使用xsd?

XML验证器如何知道在哪里可以找到XML文档中声明的模式实例,以便解析和使用xsd?,xml,validation,xsd,schema,instance,Xml,Validation,Xsd,Schema,Instance,我不理解xml验证器(w3c称之为“模式感知处理器”)如何知道在xml文档中xsd的典型外部引用中从何处找到模式实例 以下是一个典型的声明: <root xmlns="www.example.org" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="www.example.org" "http://example.org/schemas/schema1.xsd">

我不理解xml验证器(w3c称之为“模式感知处理器”)如何知道在xml文档中xsd的典型外部引用中从何处找到模式实例

以下是一个典型的声明:

<root xmlns="www.example.org"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="www.example.org" "http://example.org/schemas/schema1.xsd">
  <foo>some data</foo>
</root>

一些数据
  • 我们将根元素及其所有子元素的默认名称空间声明为“www.example.org”

  • 我们将名称/前缀“xsi”绑定到命名空间“”

  • 如果我理解正确(显然不是这样!),那么正是xsi名称空间引用的实际资源中的信息允许验证器知道schemaLocation(在下面的行中)是xsi(“”)名称空间本身的合法属性


  • 但是名称空间不是位置(URI),那么解析器如何知道去哪里确定schemaLocation是否实际上是在“名称空间”中定义的属性呢?

    验证程序内置了该名称空间的模式。XML模式定义规范说明:

    XML模式定义语言:结构定义了几个属性,可在任何XML文档中直接使用。这些属性位于上述模式实例名称空间(xsi)(§1.3.1.2)中描述的模式实例名称空间()中所有架构处理器必须为这些内置属性提供适当的属性声明,请参见“类型”属性的属性声明(§3.2.7.1)、“nil”属性的属性声明(§3.2.7.2)、“架构位置”属性的属性声明(§3.2.7.3)以及“noNamespaceSchemaLocation”属性的属性声明(§3.2.7.4)

    解析器如何知道去哪里确定 schemaLocation实际上是在 “”名称空间

    该属性是使用名称
    xsi:schemaLocation
    编写的,并且有一个名称空间声明将前缀
    xsi
    绑定到URI
    http://www.w3.org/2001/XMLSchema-instance
    ,因此XML解析器知道属性的扩展名称是(用克拉克表示法)
    {http://www.w3.org/2001/XMLSchema-instance}schemaLocation
    。这不需要任何模式知识或对外部资源的任何引用

    关于该名称空间中属性的允许内容、这些属性可能出现的位置以及它们的含义的知识内置于每个模式处理器中


    已找到扩展名为
    {http://www.w3.org/2001/XMLSchema-instance}schemaLocation
    ,因此模式验证器知道其内容应该是一系列名称空间/位置URI对。这是模式验证器只知道的,他们不需要参考模式就可以找到。因此,它知道名称空间
    www.example.org
    的模式可以在
    http://examorg/schemas/schema1.xsd
    ,它可以从该位置获取模式。

    对于“”来说,答案很简单:
    名称空间==schemaLocation
    :),所以在xsi的情况下,您是不对的!(请参阅:)…您还可以通过从该url下载(文档)来验证……您的语法有点错误(无效!):应该是
    xsi:schemaLocation=“www.example.orghttp://example.org/schemas/schema1.xsd“
    .not
    xsi:schemaLocation=“www.example.org”http://example.org/schemas/schema1.xsd“
    也可能/有效:
    xsi:schemaLocation=“www.example.orghttp://example.org/schemas/schema1.xsd http://www.w3.org/2001/XMLSchema-instance http://www.w3.org/2001/XMLSchema-instance“
    ;)怀疑这个答案是否正确-命名空间声明的语法(带前缀)is xmlns:prefix=名称空间uri。换句话说,尽管在本例中也是一个uri,但在本上下文中它是一个名称空间。我认为来自ahloces的答案必须是正确的。我的答案是正确的,我认为问题可能是它使用了您尚未完全掌握的术语。@Alohci的答案实际上是正确的,b但是它没有在知道一个名称空间URI和知道在哪里找到该名称空间URI的模式之间做出关键的区别,我认为这就是您的困惑所在。