Spring Framework XML配置元数据和命名空间

时间:2014-08-18 17:26:28

标签: java xml spring namespaces xsd

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

  1. 我读到使用命名空间对分离很有用 XML文档中的标记元素,从而避免冲突 标记(source)。
  2. 使用URI来命名命名空间被视为标准,而不是 意味着将在网址中搜索文件,用于 示例(source - 在“命名空间名称指向什么?”中。)。
  3. 命名空间的声明是使用保留的 属性,“xmlns”。
  4. 命名空间使用前缀(也称为别名),但使用 标记各种子元素(source - 在“美化”中)不需要前缀。
  5. 当我遇到以下标记时,事情开始变得混乱:

    <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中说,词汇表由Namespace识别和使用,让我理解名称“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">
    

    这段摘录摘自“Spring Framework入门 - 第二版”,第3章,第112页。

    • 可能是作者遗漏了声明“xmlns:xsi ......“?如果他没有省略,那么这段代码就错了?或者是这样 没必要写?

    修改

    我希望如果对我的问题作出回应,它包括以下内容的定义,差异和适用性:

    • 的QName。
    • 扩展名称。
    • 全球属性。

    谢谢。

2 个答案:

答案 0 :(得分:2)

1)在使用前缀之后放置的“schemaLocation”的名称是什么?这被命名为“属性”吗?如果是这样,那是什么属性? See here

  

在实例文档中,属性xsi:schemaLocation提供从作者到处理器的关于模式文档位置的提示。

     

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

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

Spring使用

<强> META-INF / spring.schemas

  1. 将schemalocation重新映射到库中的xsd
  2. (摘要)此库仅支持重新映射的版本
  3. 名为“spring.schemas”的属性文件包含XML架构位置的映射
  4. <强> META-INF / spring.handlers

    1. 为特定名称空间提供名称空间处理程序类
    2. 命名空间处理程序类提供解析器逻辑来解析spring-batch bean,如job,step等。
    3. 3)使用“xsi:schemaLocation”可以在没有声明使用带有前缀“xsi”的命名空间的情况下完成吗?

      前缀是必需的(XML标准)

答案 1 :(得分:2)

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

  

在使用前缀之后放置的&#34; schemaLocation&#34;的名称是什么?

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

在您提供的示例中,xsi:schemaLocation元素上的element属性具有限定名称(或 QName ){{1} }。限定名称可以包含(如此处)名称空间前缀(此处为xsi:schemaLocation),冒号和本地名称(此处为xsi )。

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

schemaLocation

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

  

是否命名为&#34;属性&#34;?

这个比看起来更复杂;答案是&#34;是&#34;和&#34;不&#34;。

是的,它是XML语义中的一个属性。也就是说,字符串

{http://www.w3.org/2001/XMLSchema-instance}schemaLocation

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

但是因为它是一个命名空间声明,它不是正常的&#39;属性,大多数人更喜欢将其视为属性。 XML Information Set中的[attributes]属性不包含它([namespace attributes]属性),并且XPath xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 轴不匹配它。

  

如果是,那是什么属性?

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

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

  

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

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

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

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

  

使用&#34; xsi:schemaLocation&#34;可以在没有声明使用带有前缀&#34; xsi&#34;的命名空间的情况下完成。   例如:

element
  

这段摘录摘自“#Spring; Spring Framework入门 - 第二版&#34;”,第3章,第112页。

     

是不是作者遗漏了声明&#34; xmlns:xsi ...&#34;?如果他没有省略,那么这段代码会出错吗?或者这不是必须写的吗?

命名空间声明是从祖先元素继承的,因此如果您给出的<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"> 元素作为元素的后代出现,该元素带有名称空间前缀beans的适当声明,那么您提供的XML片段符合XML命名空间规范。如果没有这样的祖先元素,那么该片段不是命名空间良好的XML。

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