XML 命名空间如何在没有正常工作网络连接的情况下工作


<?xml version="1.0" encoding="UTF-8"?>
<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"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-2.1.xsd">
  <context:component-scan
      base-package="com.springinaction.chapter01.knight" />
</beans>

上面的示例显示了具有多个命名空间的 XML 文件的示例。这些命名空间的目的是什么,最重要的是,为什么即使在没有互联网连接的情况下它们也能工作?

我认为以 xsi:schemaLocation 开头的第二位包含用于验证 XML 文档结构的 XML 架构文件。如果我在不在网络上的计算机上运行使用此配置文件的应用程序,为什么这些仍然有效?这些 URL 是否以某种方式与 JAR 文件别名?

尽量忽略许多命名空间名称看起来像您可能在浏览器中键入的 URL 这一事实。它们只是随机的字符串,它们不是网络上资源的地址。人们采用此约定的原因是,它显示了谁"拥有"该名称 - http://www.w3.org/2001/XMLSchema 所指的内容比他们选择"xsd1.0"作为命名空间名称更清楚,并且不太可能意外地与其他人选择的名称发生冲突。有些人还喜欢这样一个事实,即您可以将文档放在相关位置,但没有XML软件会自动查找文档。

让我们假设我们有这个 XML 文档。

<?xml version="1.0" encoding="UTF-8"?>
<html>
      <body>
        Your text here
      </body>
      <body>
        <height>182 cm</height>
        <weight>83 kg</weight>
      </body>
</html>

它包括具有 HTML 渲染器的语义含义的正文标记。它还有另一个身体标签,携带有关特定人的信息。命名空间定义此标记的语义范围。如果没有命名空间(如提供的示例所示(,解析器就无法区分,因为它们在语法上是相同的。

以下是同一文档的语义正确版本:

<?xml version="1.0" encoding="UTF-8"?>
<html:html xmlns:html="http://www.w3.org/TR/xhtml1/">
  <html:body>
    Your text here
  </html:body>
  <human:body xmlns:human="http://www.example.com/human/">
    <human:height>182 cm</human:height>
    <human:weight>83 kg</human:weight>
  </human:body>
</html:html>

因此,由于命名空间,我们不必担心具有不同含义的冲突标签。

命名空间 URI 本身从未实际解析过,并且是任意的(因此您可以脱机使用它们(。

XML 命名空间是元素名称的一个组成部分,在编写 xmlns:<prefix>="<namespace>" 时可以将其绑定到前缀。这有助于避免不同 XML 架构之间的命名冲突,以便您可以混合使用恰好具有相同名称的两个架构中的元素。例如,您可能有两个架构,它们都具有具有不同含义的link元素,命名空间前缀允许您通过编写 foo:linkbar:link 来区分它们。命名空间通常采用 URL 的形式,但解析器只是将其视为字符串,它不会尝试从该 URL 获取任何内容。

你对第二部分是正确的,XSI:SchemaLocation元素。请参阅此答案,了解为什么它仍然能够在没有网络连接的情况下验证架构。

命名空间

通常是为了避免标签之间的冲突,但在幕后,它是针对某些模式的解析器的处理指令。例如,在浏览器中,您有不同的文档类型,严格的Xhtml等,浏览器将这些模式存储在某处,解析器引用这些模式来验证结构。

在 Spring 中,一旦启用特定模式,它就需要在该模式存在的地方引用,这并不意味着 URI 模式没有意义。类路径中将需要相关的.jar文件,以便解析器引用它。org.springframework.context-4.1.jar. 如果你查看这个jar文件,你会发现在包org.springframework.context.config中存在spring-context-2.5.xsd文件。您定义: xmlns:context="http://www.springframework.org/schema/context"

xsi:schemaLocation="http://www.springframework.org/schema/context/spring-context-2.5.xsd">

xmlns 允许您通过编辑器使用预配置的方法编写例如来自xmlns:context<context tag,并启用经过验证的 TAG,例如:

 <context:annotation-config> 

这反过来激活了要在 Bean 类中检测的各种注释: @Required @Autowired,@PostConstruct,@PreDestroy和@Resource等等。

因此,实际上解析器将在解析 Bean 时找到意义。

非常

需要该架构,并且至少必须下载一次,以便您的 IDE 或应用程序用于验证,否则它将创建验证异常。如果它在这些 jar 中本地可用,那么它不会寻找下载。

最新更新