• 无废话XML--XML约束(schema)


    • Schema  的由来

    DTD 作为 XML 1.0 规范的重要组成部分, 对于 XML 文档的结构起到很好的描述作用。 但是,它也具有一些缺点,比如,它采用了非 XML 的语法规则、不支持数据类型、扩展性较差等等。Schema 正好解决了这些问题。从总体上讲,Schema 具有以下优点:

    •  一致性:Schema 使得对 XML 的定义不必再利用一种特定的形式化的语言,而是直接借助 XML 自身的特性,利用 XML 的基本语法规则来定义 XML 文档的结构,使得XML 达到了从内到外的完美统一,也为 XML 的进一步发展奠定了坚实的基础。

    •  扩展性:Schema 对 DTD 进行了扩充,引入了数据类型、命名空间,从而使其具备较强的可扩展性。
    •  互换性:利用 Schema,我们能够书写 XML 文档以及验证文档的合法性。另外,通过特定的映射机制,还可以将不同的 Schema 进行转换,以实现更高层次的数据交换。
    •  规范性:同 DTD 一样,Schema 也提供了一套完整的机制以约束 XML 文档中置标的使用,但相比之下,后者基于 XML,更具有规范性。Schema 利用元素的内容和属性来定义 XML 文档的整体结构,如哪些元素可以出现在文档中、元素间的关系是什么、每个元素有哪些内容和属性、以及元素出现的顺序和次数等等,都可一目了然。
    • Schema  的发展
    Schema 是伴随着 XML1.0 规范的制订而推出的,从 Schema 的第一个方案到现在为止,W3C 成员共提交了五个 Schema 规范,分别是 XML-Data、DCD(Document ContentDescription for XML)、SOX(Schema for Object-Oriented XML)、DDML(Document DefinitionMarkup Language)和 XML Schema。直到现在,关于 Schema 还没有一个正式推荐标准,它仍处于不断修改完善的过程当中。
    • 初识 Schema
    下面以一个简单的示例对 Schema 进行介绍:
    1. <?xml version="1.0" encoding="GB2312" ?>
    2. <Schema xmlns="urn:schemas-microsoft-com:xml-data"
    xmlns:dt="urn:schemas-microsoft-com:datatypes">
    3. <AttributeType name="序号"/>
    4. <AttributeType name="性别"/>
    5. <ElementType name= "姓名"/>
    6. <ElementType name= "年龄"/>
    7. <ElementType name= "电话" dt:type="fixed.14.4"/>
    8. <ElementType name= "地址" />
    9. <ElementType name= "联系人" content="eltOnly">
    10. <element type= "姓名" />
    11. <element type= "年龄" />
    12. <element type= "电话" />
    13. <element type= "地址" />
    14. </ElementType>
    15. <ElementType name= "通讯录" content="eltOnly">
    16. <element type= "联系人" />
    17. <attribute type="序号"/>
    18. <attribute type="性别"/>
    19. </ElementType>
    20.</Schema>
    ----第 1 行是 XML 类型声明语句,指明该文档是一个 XML 文档,并且符合版本 1.0 规范;该文档采用 GB2312 编码。
    ----第 2 行是 Schema 声明语句,它包含了 Schema 命名空间的声明。本例中用到了两个命名空间:一是xmlns="urn:schemas-microsoft-com:xml-data",它指定本文档是一个 XMLSchema 文档;另一个是xmlns:dt="urn:schemas-microsoft-com:datatypes",它定义了在本文档中可以使用的数据类型。
    ----第 3、4 行是属性定义语句,它定义了两个属性:序号和性别。
    ----第 5、6、7、8 行是元素定义语句,它定义了四个元素:姓名、年龄、电话、地址。其中为"电话"元素定义了数据类型:fixed.14.4。
    ----第 9-14 行定义了本 XML Schema 的二级元素:联系人,指明该元素包含四个子元素:姓名、年龄、电话、地址。
    ----第 15-19 行定义了本 XML Schema 的顶级元素:通讯录,指明该元素包含一个子元素:联系人,以及两个属性:序号、性别。
    ----第 20 行是结束标记语句,它表明该 XML Schema 的描述到此为止。
    • Schema  语法
    Schema 有着自己的一套完整的语法,涉及到的关键元素包括:Schema、ElementType、element、AttributeType、attribute、group、datatype、description。
    1,Schema元素是XML Schema中第一个出现的元素, 用于声明该XML文档是一个Schema文档。Schema 具有两个属性:name 指定该 Schema 的名称,而 xmlns 则指定该 Schema包含的命名空间。
    2,ElementType 元素是 XML Schema 中重要元素之一,用于定义该 XML Schema 文档中出现的元素。 通过属性 content 来表明 ElementType 所声明的元素是否为空、 是否包含文本、是否包含子元素、还是既包含文本又包含子元素,通过 dt:type 指定该元素的数据类型,通过 order 指定该元素的子元素的排列规则,相应取值有:one、seq、many。element 元素是用于声明在 ElementType 中出现的元素,它需要同ElementType 配合使用。
    3,AttributeType 元素用于定义在 Schema 文档中出现的属性类型。其属性 dt:type 指定所声明属性类型的数据类型, 可支持的数据类型包括: entity, entities, enumeration, id, idref,idrefs, nmtoken, nmtokens, notation, 和 string。default 属性可用于指定该属性类型的缺省取值。required 属性指定该属性对于引用它的元素是否是必须的。 attribute 元素实际上是对 AttributeType 声明的属性的引用,它也需要同 AttributeType 配合使用。
    4,group 元素是用于将 XML 文档中的元素分组。通过属性 order 可指定该分组中的元素或子分组的顺序, 通过 minOccurs 和 maxOccurs 分别指定该分组在 XML 实例文档中出现的最少和最多次数。
    5,datatype 是 XML Schema 中一个重要元素,也是 XML Schema 的一大特色,它用于为ElementType 和 AttributeType 指定数据类型。 XML Schema 支持两种数据类型, 一种是 XML1.0 标准中定义的十种基本数据类型:entity, entities, enumeration, id, idref, idrefs,nmtoken, nmtokens, notation, 和 string; 另外, 还支持一些扩展数据类型, 包括: bin.base64,bin.hex, boolean, char, date, dateTime, dateTime.tz, fixed.14.4, float, int, number, time,time.tz, i1, i2, i4, r4, r8, ui1, ui2, ui4, uri, uuid。
    6,description 只能算是 XML Schema 中一个配角,它的主要作用是为 ElementType 和AttributeType 元素提供描述信息。
    • Schema  的应用

    由于 XML Schema 的种种优点,现在 Schema 取代 DTD 已成大势所趋。在这种情况下,国际上一些知名企业和组织审时度势纷纷在战略上向 XML Schema 倾斜,提供对 XMLSchema 的支持。其中最为典型的当然要数微软的 BizTalk 和 xml.org 组织的注册/资源库。更加值得一提的是,微软在其浏览器软件 Internet Explorer 5.0 中率先提供对 Schema 的支持,当然,因为最终的 XML Schema 标准尚未正式推出,因此微软支持的 Schema 也只是过渡性"标准",今后还会不断修改。

    我们在使用框架写XML的时候,使用的就是schema。说下我理解最深的一点,为什么框架这里要使用schema,框架要放好多不同的包进来,那么这个是就会有一个命名冲突的问题。为了解决这个问题,那么我们写XML标签的时候就要声明不同的命名空间,比如说这个标签是那个命名空间下的。schema很好的解决了这个问题,而且直接一看就可以直接这份XML中,我们那些可以使用,那些不可以使用,要想只用特定的命名空间的标签那么我们必须要引入特定的schema。
    以下是一份具体的SPRINGMVC层的配置文件的schema:

    <beans xmlns="http://www.springframework.org/schema/beans"
    	   xmlns:context="http://www.springframework.org/schema/context" 
    	   xmlns:p="http://www.springframework.org/schema/p"
    	   xmlns:mvc="http://www.springframework.org/schema/mvc" 
    	   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	   xmlns:tx="http://www.springframework.org/schema/tx"
    	   xmlns:aop="http://www.springframework.org/schema/aop"
    	   xmlns:dwr="http://www.directwebremoting.org/schema/spring-dwr"
    	   xsi:schemaLocation="http://www.springframework.org/schema/beans        
    	   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
           http://www.springframework.org/schema/context       
           http://www.springframework.org/schema/context/spring-context.xsd  
           http://www.springframework.org/schema/mvc        
           http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/aop
           http://www.directwebremoting.org/schema/spring-dwr
           http://directwebremoting.org/schema/spring-dwr-2.0.xsd">

    • 关于上面这个schema说明如下:

    1,xmlns: 命名空间缺省定义方式

    2,xmlns:xsi:声明XML Schema实例名称空间并将xsi前缀与该名称空间绑定,这样模式处理器就可以识别xsi:schemaLocation属性。XML Schema实例名称空间的前缀通常使用xsi。

         如果没有那句话,下边的xsi:schemaLocation这个属性不起作用。
    3,xsi:schemaLocation:这个schema文件的地址。


    在j2ee中,上面这3个东西都是存在的,所以就不用管了。比如说web.xml里面也有这3句话的:

    <web-app xmlns="http://java.sun.com/xml/ns/j2ee"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.4"
    	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

    我们要想使用<mvc:annotation-driven />这种指定命名空间的标签,就必须导入上面xmlns:mvc="http://www.springframework.org/schema/mvc" ,意思就是告诉这个XML说:这个XML可以使用这个mvc标签了,然后里面的东西都是定义在mvc这个命名空间下的。此外还要把这个schema的地址引入进来,也就是http://www.springframework.org/schema/mvc ,http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd 这2个地址,这样子就可以使用这个mvc标签了。

    • 最后说一下命名空间
    命名空间声明有两种方式,即直接定义方式和缺省定义方式:
    直接定义方式: xmlns: [命名空间前缀] = [命名空间名]
    缺省定义方式: xmlns = [命名空间名]


  • 相关阅读:
    卷积神经网络中的傅里叶变换:1024x1024 的傅里叶卷积
    在不平衡数据上使用AUPRC替代ROCAUC
    论文推荐:TResNet改进ResNet 实现高性能 GPU 专用架构并且效果优于 EfficientNet
    信息安全风险评估
    剑指 Offer
    Docker创建容器时默认的共享内存shm太小报错,程序无法正常运行
    VS Code 连接访问本地主机上的Docker容器
    关于protobuf报错:If this call came from a _pb2.py file, your generated code is out of date and must be regenerated with protoc >= 3.19.0.
    训练神经网络时报错:can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.
    我学习使用五笔的经验
  • 原文地址:https://www.cnblogs.com/LinkinPark/p/5233114.html
Copyright © 2020-2023  润新知