我不了解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”绑定到命名空间“ http://www.w3.org/2001/XMLSchema-instance”。
如果我理解正确(显然不是这种情况!),则xsi命名空间所指的是实际资源中的信息,它使验证程序可以知道schemaLocation(在下一行中)是xsi(“ http://www.w3.org/2001/XMLSchema-instance”)命名空间本身的合法属性。
但是名称空间不是位置(URI),那么解析器如何知道去哪里确定schemaLocation实际上是否是在“ http://www.w3.org/2001/XMLSchema-instance”名称空间中定义的属性?
答案 0 :(得分:0)
验证器具有用于该命名空间的内置模式。XML模式定义规范section 2.7 Schema-Related Markup in Documents Being Validated说:
XML模式定义语言:结构定义了几个属性,可直接在任何XML文档中使用。这些属性位于上面的架构实例命名空间(xsi)(第1.3.1.2节)中描述的架构实例名称空间(http://www.w3.org/2001/XMLSchema-instance)中。 所有架构处理器必须为内置的这些属性具有适当的属性声明,请参见“类型”属性的属性声明(第3.2.7.1节),“无”属性的属性声明(第3.2.7.2节) ),“ schemaLocation”属性的属性声明(第3.2.7.3节)和“ noNamespaceSchemaLocation”属性的属性声明(第3.2.7.4节)。
答案 1 :(得分:0)
解析器如何知道去哪里确定是否 schemaLocation实际上是在 “ http://www.w3.org/2001/XMLSchema-instance”命名空间?
该属性使用名称xsi:schemaLocation
编写,并且存在一个命名空间声明,该声明将前缀xsi
绑定到URI http://www.w3.org/2001/XMLSchema-instance
,因此XML解析器知道扩展名该属性是(以Clark表示法){http://www.w3.org/2001/XMLSchema-instance}schemaLocation
。这不需要任何架构知识或对外部资源的任何引用。
每个模式处理器都内置了有关此命名空间中允许的属性内容以及这些属性可能出现的位置及其含义的知识。
找到了具有扩展名{http://www.w3.org/2001/XMLSchema-instance}schemaLocation
的属性,因此模式验证器知道其内容应为名称空间/位置URI对的序列。这是模式验证者所知道的,他们不需要引用模式就能发现这一点。因此,它知道可以在www.example.org
处找到名称空间http://example.org/schemas/schema1.xsd
的架构,并且可以从该位置获取该架构。