xmlns:xsi =“http://www.w3.org/2001/XMLSchema-instance”是XML中的一个特例吗?

时间:2010-04-11 02:57:52

标签: xml xsd xml-namespaces

当我们使用命名空间时,我们还应指出其关联的XSD所在的位置,如以下示例所示:

<?xml version="1.0"?>
<Artist BirthYear="1958" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns="http://www.webucator.com/Artist"
 xsi:schemaLocation="http://www.webucator.com/Artist Artist.xsd">
 <Name>
  <Title>Mr.</Title>
  <FirstName>Michael</FirstName>
  <LastName>Jackson</LastName>
 </Name>
</Artist>

在这里,我们已经指出Artist.xsd应该用于验证http://www.webucator.com/Artist命名空间。但是,我们也使用http://www.w3.org/2001/XMLSchema-instance命名空间,但我们没有指定其XSD所在的位置。 XML解析器如何知道如何处理这个命名空间?

更新(回应第一位评论者)

那么,我们可以代替使用:

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:ehcache="http://www.springmodules.org/schema/ehcache"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
            http://www.springmodules.org/schema/ehcache
            http://www.springmodules.org/schema/cache/springmodules-ehcache.xsd">
...
</beans>

使用

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:ehcache="http://www.springmodules.org/schema/ehcache">
...
</beans>

4 个答案:

答案 0 :(得分:9)

XML解析器如何知道如何处理此命名空间?

除非他们这样做,否则他们不会这样做。基本的想法是字符串&#39; http://www.w3.org/2001/XMLSchema-instance&#39;就像一个神奇的饼干。处理软件已经被编程为识别它,因此根据它的含义或者它没有作用。

因此,仅仅通过识别这一事实也可以获得知识&#34;它代表什么:a "namespace" that defines four attributes(&#39;类型&#39;,&#39; nil&#39;,&#39; schemaLocation&#39;&#39; noNamespaceSchemaLocation&#39;)与修复预定义含义。

换句话说,如果你&#34;知道&#34;字符串&#39; http://www.w3.org/2001/XMLSchema-instance&#39; &#34;表示&#34;,然后您还会自动知道an attribute named xsi:schemaLocation&#34;表示&#34;:它指向在&#39; W3C XML Schema&#39;中编码的模式文档。形式主义。

这超出了XML Namespaces Rec实际提供的范围(这只是一些关于&#34;通用名称&#34;或诸如此类的东西)。一个约定在这里工作,命名空间的语法(使用冒号名称)已被部署以硬编码语义理解:&#34;在W3C的形式主义中找到模式的位置XML Schema,适用于此文档实例。&#34;这一切都取决于对魔法饼干串的先前理解。

您可能会认为命名空间必须具有架构,并且机器可以处理该架构,并且只能在W3C XML Schemas形式中启动。这些都不一定是真的。存在其他模式形式(SGML / XML DTD,Relax-NG,与W3C XML Schema不同,它们都是international standards);命名空间定义不必是机器可读的(它可能是散文,因为它实际上是用于&#39; http://www.w3.org/2001/XMLSchema-instance&#39;命名空间!);并且根本不需要正式定义命名空间,因为保证所有命名空间字符串都可以用作消歧标记。

答案 1 :(得分:2)

无需说明架构的位置。如果你愿意,你可以这样做,但你不必这样做。

在此示例中,所有平台都可能了解xsixmlxsdsoap的架构都位于何处。


编辑:就像我说的,所有平台都可能知道这些着名命名空间的模式所在。很可能,他们都有模式的副本。我使用Visual Studio,它在线保存这些模式的副本,并在必要时引用它们。

答案 2 :(得分:2)

Xml schemata有四个内置声明; typenilschemaLocationnoNamespaceSchemaLocation按“定义”存在于每个架构中。您可以在Xml Schema recommendation

中了解相关信息

答案 3 :(得分:0)

如果您查看以下内容:http://www.w3.org/2001/XMLSchema-instance,您会发现有文字:

...
<xs:schema targetNamespace="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns="http://www.w3.org/1999/xhtml">
  <xs:annotation>
   <xs:documentation>
    <h1>XML Schema instance namespace</h1>
    <p>See <a href="http://www.w3.org/TR/xmlschema-1/">the XML Schema
       Recommendation</a> for an introduction</p>
...

因为xmlns="http://www.w3.org/1999/xhtml"您将上面的链接视为HTML文档。

根据http://www.w3.org/TR/xmlschema-1/#schema-loc(架构表示约束:架构文档位置策略)架构感知处理器可以按任何顺序实现以下策略的任意组合

  • 尝试解析命名空间名称以找到此类资源

所以http://www.w3.org/2001/XMLSchema-instance指向自己(是的,递归!!)。

见类似答案:Where is the XSD file for "http://www.w3.org/2001/XMLSchema-instance"?

<强> PS 即可。任何专门的XML处理器都可以将http://www.w3.org/2001/XMLSchema-instance视为已知事物,而无需实际下载此定义(大多数都是这样做的)。

<强> PPS 即可。由 XML架构标准http://www.w3.org/TR/xmlschema-1/

定义的http://www.w3.org/2001/XMLSchema-instance的语义