深入浅出xml之schema约束

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chekongfu/article/details/82185370

    XML文件,简而言之是由一系列有标记作用的标签对组成的文件。在开发工程中,XML不能随意的编写,要符合一定的规则。比如父标签都包含哪些子标签,子标签的顺序如何,标签含有哪些属性,标签内容是什么类型…也就是说XML文件要符合一定的约束。目前对XML文件的约束有两种,一种是dtd约束,另一种是schema约束。如mybatis、struts中XML文件用dtd约束,spring中XML文件用schema约束。dtd的作用机理是一种命令式的,告诉被约束的XML文件一系列的规则来,按照此规则来即可。与dtd不同,schema则更像是一种模板,XML文件按照模板写即可。毫无疑问schema约束是一种相较于dtd约束方式更优的一种方式,现在的项目开发中schema逐渐替代dtd方式,其优点主要有以下几点:
 - XML Schema符合XML语法结构。有更强的可读性。
 - DOM、SAX等XML API很容易解析出XML Schema文档中的内容。
 - XML Schema对名称空间支持得非常好。这是dtd的一个痛点。
 - XML Schema比XML DTD支持更多的数据类型,并支持用户自定义新的数据类型。
 - XML Schema定义约束的能力非常强大,可以对XML实例文档作出细致的语义限制。
 - XML Schema不能像DTD一样定义实体,比DTD更复杂,但Xml Schema现在已是w3c组织的标准,它正逐步取代DTD。

本篇文章主要讲解下schema约束。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    id="WebApp_ID" version="3.0">
    <display-name>java_review</display-name>
    <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
    </welcome-file-list>
</web-app>

    这是在eclipse中新建的一个web工程中自带的web.xml文件。我相信很多同学跟作者一样做了很多年的开发,见到这种文件已经麻木了,如果问一句为什么文件开始几行是这样写,我们会回答一直都是这样写,没出过问题啊,如果开发任务紧没时间思考情有可原,当闲暇的时候我们如果还不花点时间去了解清楚,长此以往对我们技术的精进是没有任何好处的。

1、 为什么需要xmlns?

假设有这种情况一个xml文件中有如下片段:

<table>
  <name>African Coffee Table</name>
  <width>80</width>
  <length>120</length>
</table>

<table>
  <tr>
    <td>Apples</td>
    <td>Bananas</td>
  </tr>
</table>

    两个table表达的内容不一样,会被不同的schema文件约束,也就是说此xml文件会引入多个schema文件,具体哪个schema约束哪个table该如何确定,如此一来xmlns就起到了作用,下列代码一看了然。

<xsd1:table>
  <xsd1:name>African Coffee Table</xsd1:name>
  <xsd1:width>80</xsd1:width>
  <xsd1:length>120</xsd1:length>
</xsd1:table>

<xsd2:table>
  <xsd2:tr>
    <xsd2:td>Apples</xsd2:td>
    <xsd2:td>Bananas</xsd2:td>
  </xsd2:tr>
</xsd2:table>

2、 在了解了为什么要用xmlns之后,随之要解决的问题是怎么使用xmlns?

就拿上例来说,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.it315.org/xml/schema"
    xmlns:xsd1="http://www.it315.org/table1/schema"
    xmlns:xsd2="http://www.it315.org/table2/schema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.it315.org/table1/schema 
http://www.it315.org/table1.xsd
                        http://www.it315.org/table2/schema 
http://www.it315.org/table2.xsd">
    <xsd1:table>
      <xsd1:name>African Coffee Table</xsd1:name>
      <xsd1:width>80</xsd1:width>
      <xsd1:length>120</xsd1:length>
    </xsd1:table>

    <xsd2:table>
      <xsd2:tr>
        <xsd2:td>Apples</xsd2:td>
        <xsd2:td>Bananas</xsd2:td>
      </xsd2:tr>
    </xsd2:table>
</root>

xmlns和xmlns:xsi有什么区别,xmlns指定默认命名空间,一般xml文件都会被一个默认xml约束,这样一来在写xml文件中的标签时就不用带命名空间约束。xmlns:xsi表示使用xsi作为前缀的Namespace,当然前缀xsi需要在文档中声明。

3、xsi:schemaLocation有何作用?

    我们现在回顾下上面讲的xml会被一个schema文件约束,schema文件其实也是一个xml文件,它自然而然也会被一个schema文件约束,最终就会有一个终极的约束文件,它就是被一个叫做http://www.w3.org/2001/XMLSchema-instance的uri定义。
    现在我们就很容易理解xml文件中 xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” 和xsi:schemaLocation的作用了,至于为什么一定是xsi(xml schema instance),那就是王八的臀部-龟腚(规定)了,大家只需记住这是一种固定写法即可。
    至此,我们再次看复杂的spring配置文件就会觉得有更深入的理解。

猜你喜欢

转载自blog.csdn.net/chekongfu/article/details/82185370