【问题标题】:Spring Framework XML configuration metadata, and NamespacesSpring Framework XML 配置元数据和命名空间
【发布时间】:2014-10-11 16:35:13
【问题描述】:

我一直在研究元数据信息的配置以使用 Spring,我意识到我需要深入研究一下 XML。我对 XML 文件中的引用方案有疑问。到目前为止,我所知道的(我猜......)如下:

  1. 我读到命名空间的使用对于分离是有用的 XML 文档中的标记元素,从而避免在 标记 (source)。
  2. 使用 URI 命名命名空间被视为一种标准,而不是 表示将在 Web 地址中搜索文件,例如 示例(source - 在“命名空间名称指向什么?”)。
  3. 命名空间的声明是使用保留的 属性,“xmlns”。
  4. 命名空间使用前缀(也称为别名),但使用 标记各种子元素不需要前缀(source - 在“美化”中)。

当我遇到以下标记时,事情开始变得混乱:

<element xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://www.w3.org/1999/XSL/Transform
                             http://www.w3.org/1999/XSL/Transform.xsd
                             http://www.w3.org/1999/xhtml
                             http://www.w3.org/1999/xhtml.xsd">
</element>

根据许多来源(包括 this),引用 XSD 架构是使用(在我看来)命名空间,正如已经说过的那样,它不指向任何东西,没有文件或任何东西。

session 2.6 中说,词汇表是由命名空间识别和使用的,这让我理解名称“schemaLocation”是一个保留字,并与所选前缀“xsi”一起使用。我想知道一些与这里介绍的事实有关的事情:

  • “schemaLocation”的名称是什么,放在前缀之后 用过的?这是否被称为“属性”?如果是,它是什么属性?
  • Spring 以不同的方式识别某些命名空间,执行其 在它之上有自己的逻辑,或者命名空间真的有可能吗 指向地址中的物理文件?
  • 可以在没有声明的情况下使用“xsi:schemaLocation” 使用前缀为“xsi”的命名空间?

例如:

<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:util="http://www.springframework.org/schema/util"
   xsi:schemaLocation="..... http://www.springframework.org/schema/util 
   http://www.springframework.org/schema/util/spring-util-4.0.xsd">

这个 sn-p 摘自《Spring Framework 入门 - 第二版》一书,第 3 章,第 112 页。

  • 会不会是作者遗漏了声明“xmlns:xsi ...”?如果他没有省略,那么这段代码就错了?还是这个 不需要写吗?

编辑

如果我的问题得到答复,我希望它包括以下定义、差异和适用性:

  • Q 名称。
  • 扩展名称。
  • 全局属性。

谢谢。

【问题讨论】:

    标签: java xml spring namespaces xsd


    【解决方案1】:

    1) “schemaLocation”的名称是什么,放在使用的前缀之后?这是否被称为“属性”?如果有,它是什么属性? See here

    在实例文档中,属性 xsi:schemaLocation 向处理器提供有关架构文档位置的提示。

    schemaLocation 属性值由一对或多对 URI 引用,以空格分隔。每个人的第一个成员 pair 是命名空间名称,pair 的第二个成员是提示 描述在哪里可以找到合适的模式文档 命名空间。这些提示的存在不需要处理器 获取或使用引用的模式文档,处理器是免费的 使用通过任何适当方式获得的其他模式,或不使用 架构。

    2) Spring 以不同方式识别某些命名空间,在其之上执行自己的逻辑,或者命名空间是否真的指向地址中的物理文件?

    春天使用

    META-INF/spring.schemas

    1. 将架构位置重新映射 (*) 到库中的 xsd
    2. (摘要)此库仅支持重新映射的版本
    3. 名为“spring.schemas”的属性文件包含 XML Schema 位置的映射

    META-INF/spring.handlers

    1. 为特定命名空间提供命名空间处理程序类
    2. 命名空间处理程序类提供解析器逻辑来解析 spring-batch bean,如作业、步骤等。

    3) “xsi:schemaLocation”的使用可以在没有声明使用前缀为“xsi”的命名空间的情况下完成?

    前缀是强制性的(XML标准)

    【讨论】:

    • 感谢您的关注。我猜有些事情解释得很清楚,有些事情解释得不好。我觉得你的回答有所帮助,但它缺少一些东西。不过,真的感谢您的帮助。
    【解决方案2】:

    我不确定我是否正确理解了您的问题;问问这是否没有告诉你你想知道。

    “schemaLocation”的名称是什么,放在使用的前缀之后?

    在处理命名空间时,最好克服术语name 具有单一或简单含义的想法。当你问“什么是名字......”时,你的词假设有一些单一的东西是属性的 name。没有。这里涉及几种不同的名称;最重要的两个是 qualified name(您在 XML 文档中编写的内容)和 expanded name(大多数进程用来决定它们是否负责使用XML 文档的给定部分)。

    在您给出的示例中,element 元素上的xsi:schemaLocation 属性具有限定名称(或QNamexsi:schemaLocation。一个限定名可以由(如这里)一个命名空间前缀(这里是xsi)、一个冒号和一个本地名称(这里是schemaLocation)组成。

    在符合the W3C Namespaces Recommendation 的文档中,命名空间前缀通过命名空间声明(有时也称为命名空间属性)绑定到命名空间名称。在您给出的示例中,命名空间声明

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    

    将前缀xs 绑定到命名空间http://www.w3.org/2001/XMLSchema-instance。因此,在上下文中,QName xsi:schemaLocation 表示扩展名 {http://www.w3.org/2001/XMLSchema-instance}schemaLocation

    这是否被命名为“属性”?

    这个比看起来更复杂;答案是“是”和“否”。

    是的,它是 XML 意义上的属性。也就是字符串

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    

    匹配XML specification 中非终结符属性 的语法,并出现在适当的上下文中。

    但是因为它是一个命名空间声明,它不是一个“正常”的属性,而且大多数人更愿意将它视为不是一个属性。 XML Information Set 中的 [attributes] 属性不包含它([namespace attributes] 属性包含),XPath attribute 轴不会匹配它。

    如果是,它是什么属性?

    所有 XML 属性都是其宿主元素(此处为名称为 element 的元素)的属性。

    请注意,属性这个词在信息技术的不同部分有不同的含义; XML 文档中元素的属性与信息的关系模型中讨论的属性根本没有任何关系。

    Spring 以不同的方式识别某些命名空间,在其之上执行自己的逻辑,或者命名空间是否真的指向地址中的物理文件?

    命名空间名称的作用是相互区分,以便处理软件能够区分可能具有相同本地名称但属于不同命名空间的不同元素和属性。 (这只是因为人们知道在命名新元素时不要将命名空间 URI 用于他们无法控制的部分 URI 空间。)

    所以不,一般来说,命名空间名称通常不指向任何机器上的文件。 (由于它们是 URI,当然,当人们取消引用命名空间 URI 时,相关服务器的所有者可以将服务器配置为返回描述命名空间及其用法的文档。大多数理智的人认为这是一种好的做法。)

    一个关注多个命名空间的复杂软件很可能使用命名空间名称来指向其数据结构或它正在使用的文件系统中的适当位置。但这不是您关心的问题,除非您正在维护这样的软件。

    “xsi: schemaLocation”的使用可以在没有声明使用前缀为“xsi”的命名空间的情况下完成吗? 例如:

    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:util="http://www.springframework.org/schema/util"
       xsi:schemaLocation=".....    
          http://www.springframework.org/schema/util 
          http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    

    这个 sn-p 摘自《Spring Framework 入门 - 第二版》一书,第 3 章,第 112 页。

    会不会是作者遗漏了声明“xmlns: xsi ...”?如果他没有省略,那么这段代码会出错吗?还是不用写?

    命名空间声明继承自祖先元素,因此如果您提供的 beans 元素作为带有命名空间前缀 xsi 的适当声明的元素的后代出现,那么您提供的 XML 片段符合 XML命名空间规范。如果没有这样的祖先元素,则该片段不是命名空间格式良好的 XML。

    出于 XSD 规范的目的(它定义了前缀通常为 xsi 的命名空间),所讨论的前缀不需要是 xsi —— 任何适当绑定的前缀都可以。 XSD 感知软件通过识别其扩展名称而非限定名称来理解 XSD 标记。

    【讨论】:

    • 我一直在研究 QName、扩展名称和全局属性。您告诉我 QName 由三​​部分组成。我读到它收到另一个名称,扩展名称。您能否编辑您的答案以更好地解释 QName、扩展名称和全局属性的定义,同时指出它们的区别以及它们的使用位置?您的回答非常非常好,但是有些事情仍然不是很清楚。如果可能的话,我只是希望这些术语能够以一种清晰的教学方式进行定义和区分。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-04
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多