xsi:schemaLocation的用途是什么?


131

我看到我们有多个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有什么区别?

Answers:


87

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

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


XML解析器不会搜索类路径吗?
HDave 2012年

1
@skaffman,这是否意味着当我使用-o(脱机)标志运行基于spring的projehect的maven构建时,尽管所有依赖项都在本地存储库中可用,但是构建仍将失败?
aviad

@HDave但是将XML解析器寻找,模式可以有任何名称
克日什托夫·Krasoń

从技术上讲,XML解析器将首先尝试从Internet加载架构,如果找不到或无法访问Internet,它将从类路径中本地搜索* .xsd文件,如果仍然找不到,则将其省略。
张张

有关弹簧拦截层的更多信息,请参见stackoverflow.com/a/10768972/32453
rogerdpack

68

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

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

xsi:schemaLocation 应该提供有关实际架构位置的提示:

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


22

根据用于定位架构规范

通过命名空间名称可能无法获取模式...用户社区和/或消费者/提供者协议可能会在某些情况下[尝试从命名空间url检索xsd]是明智的默认策略。

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

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

因此,基本上只指定一个名称空间,就可以schemaLocation根据您的“社区” 尝试根据该位置的xsd来验证您的XML“可能”(即使它没有属性)。如果您指定一个specific schemaLocation,那么它基本上意味着该xml文档“应该”与所述xsd保持一致,因此“请对其进行验证”(在我阅读时)。我的猜测是,如果您不执行“ a” schemaLocation或“ noNamespaceSchemaLocation属性”操作,大多数情况下只是“未通过验证”(基于其他答案,看来java就是这样做的)。

另一个问题是,通常在Java库中通过xsd验证[例如:spring config xml文件],如果您的XML文件在XML文件中指定了特定的schemaLocationxsd url,例如xsi:schemaLocation="http://somewhere http://somewhere/something.xsd"通常在您的一个依赖罐中,它将包含一个副本。该xsd文件在其资源部分中,并且spring具有“映射”功能,该功能表示将xsd文件当作映射到url一样对待http://somewhere/something.xsd(因此,您永远不会最终上网并下载该文件,它只存在于本地)。另请参阅https://stackoverflow.com/a/41225329/32453,以了解更多信息。


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.