【问题标题】:what is the use of xsi:schemaLocation?xsi:schemaLocation 有什么用?
【发布时间】:2011-08-18 00:23:35
【问题描述】:

我看到我们有多个 url 作为这个属性的值,就像在 spring 中一样:

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

为什么需要它以及它的用途是什么? Spring 是否会转到 url 并进行验证? xmlns 和 xsi:schemaLocation 有什么区别?

【问题讨论】:

    标签: xsd


    【解决方案1】:

    spring 使用的 Java XML 解析器将读取 schemaLocation 值并尝试从 Internet 加载它们,以验证 XML 文件。反过来,Spring 会拦截这些加载请求并从其自己的 JAR 文件中提供版本。

    如果您省略 schemaLocation,则 XML 解析器将不知道从何处获取架构以验证配置。

    【讨论】:

    • XML 解析器不会搜索类路径吗?
    • @skaffman,这是否意味着当我使用 -o (离线)标志运行基于 spring 的项目的 maven 构建时,尽管所有依赖项都在我的本地存储库中可用,但构建将失败?
    • @HDave 但是 XML 解析器要寻找什么,架构可以有任何名称
    • 从技术上讲,XML 解析器会首先尝试从 Internet 加载模式,如果没有找到或无法访问 Internet,它会从类路径中搜索本地 *.xsd 文件,如果仍然找不到,它将被省略。
    • 更多关于spring拦截层的信息,见stackoverflow.com/a/10768972/32453
    【解决方案2】:

    xmlns 是文档中的唯一标识符 - 它不必是架构的 URI:

    XML 命名空间提供了一种简单的方法来限定可扩展标记语言文档中使用的元素和属性名称,方法是将它们与由 URI 引用标识的命名空间相关联。

    xsi:schemaLocation 应该给出关于实际模式位置的提示:

    可用于文档中,以提供有关可用于评估的架构文档的物理位置的提示。

    【讨论】:

      【解决方案3】:

      根据spec for locating Schemas

      可能存在也可能不存在可通过命名空间名称检索的架构...用户社区和/或消费者/提供者协议可能会确定 [尝试从命名空间 url 检索 xsd] 是明智的默认策略的情况

      (感谢您的明确,规范!)

      如果文档作者(人类或非人)创建了具有特定架构的文档,并保证部分或全部文档符合该架构,则提供 schemaLocation 和 noNamespaceSchemaLocation [属性]。

      因此,基本上只指定一个命名空间,您的 XML“可能”会被尝试针对该位置的 xsd 进行验证(即使它缺少 schemaLocation 属性),具体取决于您的“社区”。如果你指定一个特定的schemaLocation,那么它基本上意味着 xml 文档“应该”符合所说的 xsd,所以“请验证它”(正如我所读的那样)。我的猜测是,如果您不执行 schemaLocationnoNamespaceSchemaLocation 属性,则大多数情况下它只是“未验证”(根据其他答案,java 似乎是这样做的)。

      这里的另一个问题是,如果您的 XML 文件在 XML 文件中指定特定的 schemaLocation xsd url,例如 xsi:schemaLocation="http://somewhere http://somewhere/something.xsd" 通常在您的依赖项 jar 将在其资源部分中包含该 xsd 文件的副本,并且 spring 具有“映射”功能,表示将该 xsd 文件视为映射到 url http://somewhere/something.xsd (所以你永远不会去网上下载文件,它只存在于本地)。另请参阅https://stackoverflow.com/a/41225329/32453 了解更多信息。

      【讨论】:

        【解决方案4】:

        如果您进入这些位置中的任何一个,那么您会发现这些架构中定义的内容。例如,它告诉您 ini-method 关键字值的数据类型是什么。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-09-05
          • 2010-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多