zoukankan      html  css  js  c++  java
  • 编程基础XML约束

    2020年新年第一天,不写一篇博客纪念一下都感觉对不起这个跨年

    为什么会写一篇关于xml的博客呢?xml在编程中用的又不多,再多也用不着自己写约束文件,只要能看懂就行了不是吗?嗯,没别的原因,就是想研究一下xml方便以后自己看~

    说一下思路,在Java语言中,web开发会涉及到配置文件,配置文件基本上都是通过xml来写的,为什么要写配置文件,我的理解是:通过使用配置文件来注册(加载)一下某个东西,这样在具体使用的时候就不需要注册(加载)了。这里呢,给我的感觉是有点依赖注入的意思,说明一下,我没接触过具体的依赖注入,只是了解一点大体的思想。有点依赖注入的意思了之后就让我想起了一个词IOC,控制反转。这个是一种框架设计的理念。然后呢,紧接一步就是DDD(领域驱动模型),之后就会涉及到框架的设计了。现在你还觉得学习xml是一种鸡肋吗? 在Java中为什么会使用大部分的xml写配置文件?有待研究~

    好了,步入正题:

    1.Xml:

    xml叫做可扩展性标记语言,可扩展是只它的所有标签都是自定义的,xml出现的本意是替代Html,但是因为它的标签定义太灵活了,写法太严格了,所以用途就变成了传输数据和保存数据。前面说到了框架的设计会使用它,但是框架是死的,只能根据特定的名字(标签)来获取数据呀,所以,我们就引出了xml的约束。

    xml的约束有两种:DTD和Schema

    2.DTD约束

    DTD是xml的一种约束技术,它的后缀名是.dtd,它的作用是验证Xml文档是不是一个有效的Xml文档。它有自己独立的语法规范,描述元素,属性和其他杂项在xml文档中的使用规则说明。

    2.1DTD的分类

    内部DTD:DTD和xml文档在一个文件中:

    <?xml version="1.0" encoding="UTF-8"?>
    //      定义跟标签students
            <!DOCTYPE students[
    //           跟标签中可以包含一个或多个stu标签
                <!ELEMENT students (stu+)>
    //           stu标签中有三个标签(属性),id,name,age
                <!ELEMENT stu (id,name,age)>
    //           设置id的约束,可以包含任何字符数据,但是不能在其中包含任何子元素
                <!ELEMENT id   (#PCDATA)>
                <!ELEMENT name (#PCDATA)>
                <!ELEMENT age  (#PCDATA)>
            ]>
    <students>
        <stu>
            <id>1</id>
            <name>tom</name>
            <age>20</age>
        </stu>
    </students>
    

      这里的+跟正则中的匹配符的用法类似,想了解的朋友可以看我之前的博客。有讲过正则的基本使用。

    外部DTD:DTD和xml文档不在同一个文件中.

    <!ELEMENT students (student*) >
    <!ELEMENT student (name,age,sex)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    <!ELEMENT sex (#PCDATA)>
    <!ATTLIST student number ID #REQUIRED>

    使用:

    <?xml version="1.0" encoding="UTF-8" ?>
    //<!DOCTYPE 跟标签名 SYSTEM "dtd文件位置url" <!DOCTYPE students SYSTEM "student.dtd"> <students> <student number="0001"> <name>tom</name> <age>18</age> <sex>male</sex> </student> <student number="0002"> <name>李四</name> <age>15</age> <sex>男</sex> </student> </students>
    <!ELEMENT students (stu*)>
    <!ELEMENT stu (#PCDATA)>
    <!--ATTLIST定义属性-->
    <!--CDATA属性值可以是任何字符(可包括数字和中文)-->
    <!--ID:属性值必须唯一,属性值必须满足xml命名规则-->
    <!--enumerated:(枚举值1|枚举值2|枚举值3....),属性值必须在枚举值中-->
    <!ATTLIST stu
        id   CDATA #REQUIRED
        name CDATA #REQUIRED
    >
    ATTLIST定义属性
    CDATA属性值可以是任何字符(可包括数字和中文)
    ID:属性值必须唯一,属性值必须满足xml命名规则
    enumerated:(枚举值1|枚举值2|枚举值3....),属性值必须在枚举值中
    #REQUIRED:元素的所有实例都必须有该属性
    #IMPLIED:属性可以不出现
    default-value:属性可以不出现,并且当它不出现的时候是有默认值的
    #FIXED:属性可以不出现,但是如果出现的话就一定是指定的属性值;
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE students SYSTEM "test01.dtd">
    <students>
        <stu id="1" name="tom"></stu>
    </students>

    其实DTD的写法还是挺简单的,简单就意味着功能不完全,它的缺点给也很明显:

    它只能规定标签的格式,并不能规定标签中数据的格式。下面我们讲本篇博客的重点:Schema约束

    3.Schema约束

    Schema约束是一种复杂约束技术,它复杂,但是它功能强大

    <?xml version="1.0"?>
    <xsd:schema xmlns="http://www.itcast.cn/xml"
            xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.itcast.cn/xml" elementFormDefault="qualified">
        <!--定义一个元素(element),他的名称叫students,类型是studentsType-->
        <xsd:element name="students" type="studentsType"/>
        <!--声明studentsType类型(complexType)-->
        <xsd:complexType name="studentsType">
            <!--sequence元素要求组中的元素以指定的顺序出现在包含元素中。每个子元素可出现 0 次到任意次数-->
            <xsd:sequence>
                <!--定义一个student元素,类型是studentType,它可以出现0-无数个-->
                <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
        <!--声明了类型:studentType-->
        <xsd:complexType name="studentType">
            <xsd:sequence>
                <!--定义三个元素,和类型-->
                <xsd:element name="name" type="xsd:string"/>
                <xsd:element name="age" type="ageType" />
                <xsd:element name="sex" type="sexType" />
            </xsd:sequence>
            <xsd:attribute name="number" type="numberType" use="required"/>
        </xsd:complexType>
        <!--声明三个类型-->
        <xsd:simpleType name="sexType">
            <!--定义数据限制内容restriction,他的限制内容是string-->
            <xsd:restriction base="xsd:string">
                <!--定义一个xml枚举值-->
                <xsd:enumeration value="male"/>
                <xsd:enumeration value="female"/>
            </xsd:restriction>
        </xsd:simpleType>
        <xsd:simpleType name="ageType">
            <xsd:restriction base="xsd:integer">
                <!--定义数值的下限和上限-->
                <xsd:minInclusive value="0"/>
                <xsd:maxInclusive value="256"/>
            </xsd:restriction>
        </xsd:simpleType>
        <xsd:simpleType name="numberType">
            <xsd:restriction base="xsd:string">
                <!--定义可接受的字符的精确序列。-->
                <xsd:pattern value="heima_\d{4}"/>
            </xsd:restriction>
        </xsd:simpleType>
    </xsd:schema> 

    很神奇吧,Schema约束竟然也是一个XML文件!!!

    讲解一下元素的含义:

    <xsd:schema xmlns="http://www.itcast.cn/xml"  #默认命名空间的声明,
            xmlns:xsd="http://www.w3.org/2001/XMLSchema" #显示 schema 中用到的元素和数据类型来自命名空间 "http://www.w3.org/2001/XMLSchema",而且规定来自该命名空间的元素和数据类型应使用前缀xsd
            targetNamespace="http://www.itcast.cn/xml"  #显示被此 schema 定义的元素 (note, to, from, heading, body) 来自命名空间http://www.itcast.cn/xml
         elementFormDefault="qualified"> #指出任何 XML 实例文档所使用的且在此 schema 中声明过的元素必须被命名空间限定
    <!--定义一个元素(element),他的名称叫students,类型是studentsType-->
        <xsd:element name="students" type="studentsType"/>
    <!--声明studentsType类型(complexType)-->
        <xsd:complexType name="studentsType">
    <!--sequence元素要求组中的元素以指定的顺序出现在包含元素中。每个子元素可出现 0 次到任意次数-->
        <xsd:sequence>
    <!--定义一个student元素,类型是studentType,它可以出现0-无数个-->
        <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>

    使用Schema
    <?xml version="1.0" encoding="UTF-8" ?>
    <!--
        引用的xml命名空间
        xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"
        引入的xml版本号,前缀名
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        为每一个xsd约束声明一个前缀,作为标识,不写标识默认是这个
        xmlns="http://www.itcast.cn/xml
    -->
     <students   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://www.itcast.cn/xml"
             xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"
                 >
         <student number="heima_0001">
             <name>tom</name>
             <age>18</age>
             <sex>male</sex>
         </student>
             
     </students>

    ok,今天的分享到此结束!

    参考连接:

    https://www.cnblogs.com/yfstudy/p/9183264.html

    https://www.runoob.com/schema/schema-schema.html

    https://blog.csdn.net/CristianoJason/article/details/51282739

    https://blog.csdn.net/qq_41517071/article/details/82873237

  • 相关阅读:
    网站视频播放器JCPlayer
    常用Linux命令操作
    对词法分析器的了解
    实验二简化版C语言中文理解程序文法
    词法分析
    实验三有穷自动机的构造和识别
    组合数据类型练习,综合练习
    零基础初学者学习编译原理
    用python画五星红旗
    Android环境搭建和编写helloworld
  • 原文地址:https://www.cnblogs.com/Xiaomoml/p/12128043.html
Copyright © 2011-2022 走看看