• XML基础


    XML基础

    标签 : Java基础


    XML简介

    XML(eXtensible Markup Language:可扩展标记型语言)被设计用来传输和存储数据,可扩展说明标签可以自定义(还可以定义中文标签<猫></猫>),XML有1.0/1.1两个版本,但一般使用都是1.0版本(由于1.1版本不能向下兼容).

    <?xml version="1.0" encoding="UTF-8"?>
    • XML用于传输/存储数据
      • 不同的系统之间传输数据,如IM之间数据的传输;
      • 用来表示有层级关系的数据:
      • 经常用在文件配置, 如Spring, MyBatis的配置文件(比如将数据库信息都放到配置文件中,如果需要修改数据库配置,并不需要修改源代码,只修改XML配置文件即可)

    XML语法

    XML文档声明

    <?xml version="1.0" encoding="UTF-8"?>
    • 属性
      • version:xml的版本 1.0
      • encoding:xml编码 utf-8
      • standalone:是否需要依赖其他文件 yes/no
    • XML中文乱码原因:保存的编码和打开的编码不一致

    XML定义元素/标签

    • 有开始必须要有结束:<person></person>
    • 如果标签没有内容,可以在标签内结束: <aa/>
    • 标签可以嵌套:<aa><bb></bb></aa>
    • 一个XML文件中,有且仅有一个根标签(其他标签都是根标签的子标签)
    • 在XML中把空格和换行都当成内容来解析,下面这两段代码含义是不一样的:
    <name>翡青</name>
    <name>
        翡青
    </name>
    • 标签命名规则
      • 标签区分大小写;
      • 标签可以是中文,但不能以数字和下划线开头, 也不能以xml、XML、Xml等开头;
      • 标签不能包含空格和冒号;

    XML定义属性

    <name from="china" language="chinese">翡青</name>
    • 属性定义规范
      • 一个标签上可以有多个属性, 但多个属性名称不能相同
      • 属性名称和属性值之间使用=,属性值使用引号括起来(单引号/双引号)
      • XML属性的命名规范和元素一致

    XML注释

    <!-- XML的注释 -->
    注意: 注释不能嵌套


    特殊字符与CDATA区

    如果要在XML中书写特殊字符(如<),需要对其转义(如$lt), 规则同HTML.
    如果有多个字符都需要进行转义,如

    if (a > b && a < c) {
        System.out.println("a is the biggest");
    }

    则可以将这些内容放到CDATA区中:

    <![CDATA[
    if (a > b && a < c) {
        System.out.println("a is the biggest");
    }
    ]]>
    • CDATA区语法
    <![CDATA[ 内容  ]]>

    CDATA区内的特殊字符被当做文本内容,而不是标签.

    上面只是介绍了XML的常用语法, 详细内容介绍可以参考W3School XML 教程.


    DTD约束

    XML约束:规定XML中只能出现的元素以及元素的形式,包含DTD约束(如:MyBatis)和Schema约束(如:Spring)两种.


    DTD开始

    • 书写
    <!ELEMENT person (name, age) >
            <!ELEMENT name (#PCDATA) >
            <!ELEMENT age (#PCDATA) >
    • 引入
    <!DOCTYPE person SYSTEM "constraint.dtd">

    注: 如果想要校验XML约束,需要使用工具(比如IDEA),浏览器只负责校验XML语法,不负责校验约束.


    DTD三种引入方式

    • 引入本地dtd文件
    <!DOCTYPE 根元素名称 SYSTEM "dtd路径">
    • 引用内部的dtd文件(不推荐)
    <!DOCTYPE person [
            <!ELEMENT person (name,age)>
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT age (#PCDATA)>
            ]>
    • 引用网络dtd文件(最常用)
    <!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档URL">

    MyBatis实例

    • MyBatis的mapper配置文件
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    • MyBatis的config配置文件
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
            "http://mybatis.org/dtd/mybatis-3-config.dtd">
    

    DTD定义元素/标签

    <!ELEMENT 元素(标签)名 约束>
    • 简单元素(没有子元素的元素)
    <!ELEMENT name (#PCDATA)>
      • 属性:
        • (#PCDATA) : 指定字符串类型
        • EMPTY : 为空
        • ANY : 任意,可以为空/也可以不为空
    <!ELEMENT person (name, age, sex, school) >
            <!ELEMENT name (#PCDATA) >
            <!ELEMENT age (#PCDATA) >
            <!ELEMENT sex EMPTY>
            <!ELEMENT school ANY>
    • 复杂元素
    <!ELEMENT 元素名称 (子元素)>

    默认子元素只能出现一次

    符号 出现次数
    + 一次或者多次
    * 零次或者多次
    ? 零次或者一次
    <!ELEMENT person (name, school*) >
            <!ELEMENT name (#PCDATA) >
            <!ELEMENT school (#PCDATA)>

    分隔符:

    • 子元素直接使用,分隔,表示元素按顺序定义
    • 子元素直接使用|分隔,表示元素只能出现其中的任意一个
    <!ELEMENT person (name, sex | xingbie, school*) >
            <!ELEMENT name (#PCDATA) >
            <!ELEMENT sex (#PCDATA)>
            <!ELEMENT xingbie (#PCDATA)>
            <!ELEMENT school (#PCDATA)>

    DTD定义属性

    <!ATTLIST 元素(标签)名称
            属性名称 属性类型 属性的约束
            >
    • 属性类型
    属性 解释
    CDATA 字符串(常用)
    枚举 枚举值之一
    ID 约定值只能以字母/下划线开头
    <!ELEMENT person (name, school) >
            <!ELEMENT name (#PCDATA) >
            <!ELEMENT school (#PCDATA)>
            <!ATTLIST school
                    where CDATA #REQUIRED
                    >
    <!ELEMENT street (light) >
            <!ELEMENT light (#PCDATA)>
            <!ATTLIST light
                    color (red | green | yello) #REQUIRED
                    >
    • 属性的约束
    约束 解释
    #REQUIRED 属性必须存在(常用)
    #IMPLIED 属性可有可无(常用)
    #FIXED 表示一个固定值 #FIXED “AAA”, 属性的值必须是设置的这个固定值(不要与枚举类型一起用)
    默认值 如果没有在XML中定义该属性,则使用默认值

    默认值

    <!ELEMENT street (light) >
            <!ELEMENT light (#PCDATA)>
            <!ATTLIST light
                    color CDATA "YELLOW"
                    >

    #FIXD固定值

    <!ELEMENT street (light) >
            <!ELEMENT light (#PCDATA)>
            <!ATTLIST light
                    color CDATA #FIXED "YELLOW"
                    >

    DTD实例

    模拟Spring约束

    <!ELEMENT beans (bean*) >
            <!ELEMENT bean (property*)>
            <!ATTLIST bean
                    id CDATA #REQUIRED
                    class CDATA #REQUIRED
                    >
    
            <!ELEMENT property EMPTY>
            <!ATTLIST property
                    name CDATA #REQUIRED
                    value CDATA #IMPLIED
                    ref CDATA #IMPLIED>

    根据DTD约束可以写出XML如下:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE beans SYSTEM "constraint.dtd">
    <beans>
        <bean id="id1" class="com.fq.domain.Bean">
            <property name="isUsed" value="true"/>
        </bean>
        <bean id="id2" class="com.fq.domain.ComplexBean">
            <property name="refBean" ref="id1"/>
        </bean>
    </beans>

    在这里只对DTD做简单的介绍, 详细请参考W3School DTD 教程.


    Schema约束

    相比DTD约束, Schema更符合XML的语法,Schema直接使用XML语句.

    • 一个XML文件只能有一个DTD,但可以有多个Schema(使用命名空间区分,类似Java包);
    • DTD里面只有PCDATA类型,但Schema可以支持更多的数据类型;
    • Schema语法更加复杂, 可以对XML做出更加细致的语意限制, 但Schema目前并未完全替代DTD.

    Schema根标签

    Schema文件的后缀名为.xsd, 根标签为<schema>

    <?xml version="1.0" encoding="utf-8"?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.fq.me/context"
            elementFormDefault="qualified">
    
    </schema>
    • 属性
      • xmlns="http://www.w3.org/2001/XMLSchema"
        表示当前XSD是一个约束文件
      • targetNamespace="http://www.fq.me/context"
        Schema命名空间,如果XML需要使用当前约束文件,需要通过这个地址引入该约束文件
      • elementFormDefault="qualified"
        表明该Schema是质量良好的,所有全局元素的子元素将被以缺省方式放到目标命名空间;

    Schema引入

    <?xml version="1.0" encoding="utf-8"?>
    <person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xmlns="http://www.fq.me/context"
            xsi:schemaLocation="http://www.fq.me/context constraint.xsd">
    
    </person>
    • xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      表示当前XML是被约束的文件

    • xmlns="http://www.fq.me/context"
      约束文档中的targetNamespace

    • xsi:schemaLocation="http://www.fq.me/context constraint.xsd"
      Schema约束文件的location: targetNamespace+约束文件路径

    Schema定义元素

    • 简单元素
    <element name="name" type="string"/>
    <element name="age" type="int"/>
    <element name="sex" type="boolean"/>
    • 复杂元素
    <element name="person">
        <complexType>
            <sequence>
                <!-- 复杂元素的子元素(简单元素/复杂元素) -->
                <element name="name" type="string"/>
                <element name="age" type="int"/>
                <element name="sex" type="boolean"/>
            </sequence>
        </complexType>
    </element>

    Schema定义属性

    <element name="name" maxOccurs="unbounded">
        <complexType>
            <attribute name="from" type="string" use="required"/>
        </complexType>
    </element>

    必须是复杂元素才能有属性(写在<complexType></complexType>中)

    • name: 属性名称
    • type:属性类型
    • use:属性是否必须出现

    maxOccurs="unbounded" 表示元素可以出现任意次


    Schema指示器

    通过指示器,我们可以控制在文档中使用元素的方式.

    指示器 释义
    <sequence> 必须按顺序出现
    <all> 按照任意顺序出现, 但只能出现一次
    <choice> 元素只能出现其中的一个
        <element name="person">
            <complexType>
                <sequence>
                    <!-- 复杂元素的子元素 -->
                    <element name="name" maxOccurs="unbounded"/>
                    <choice>
                        <element name="from" type="string"/>
                        <element name="从哪儿来" type="string"/>
                    </choice>
                </sequence>
            </complexType>
        </element>

    XML命名空间

    每个约束文档都可以被赋予唯一的命名空间,用一个URI表示;在书写XML时,可以通过命名空间声明当前编写的标签来自哪个Schema约束文档。如:

    <?xml version="1.0" encoding="utf-8"?>
    <context:beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xmlns:context="http://www.fq.me/context"
                   xsi:schemaLocation="http://www.fq.me/context constraint.xsd">
        <context:bean id="id1" class="com.fq.benz">
            <context:property name="name" ref="ref-bean"/>
        </context:bean>
    </context:beans>

    此处使用xmlns:context来声明context是一个命名空间,后面对该命名空间的引用,都可以用<context: ...>.

    命名空间的语法很容易让人混淆,尽管以http://开始,但并不指向一个文件,而只是一个分配的名字

    一个命名空间的Schema文件具体位置,需要使用schemaLocation属性来指定:

    <context:beans ...
                   xsi:schemaLocation="http://www.fq.me/context constraint1.xsd">

    schemaLocation属性有两个值. a.命名空间;b.供命名空间使用的Schema位置(本地/网络).两者之间用空格分隔.

    引入命名空间的作用是可以在一个XML文档中引入多个Schema约束.


    Schema实例

    模拟Spring约束

    • context.xsd
    <?xml version="1.0" encoding="utf-8"?>
    <schema xmlns="http://www.w3.org/2001/XMLSchema"
            targetNamespace="http://www.fq.me/context"
            elementFormDefault="qualified">
        <element name="beans">
            <complexType>
                <sequence>
                    <element name="bean" maxOccurs="unbounded">
                        <complexType>
                            <sequence>
                                <element name="property" maxOccurs="unbounded">
                                    <complexType>
                                        <attribute name="name" type="string" use="required"/>
                                        <attribute name="value" type="string" use="optional"/>
                                        <attribute name="ref" type="string" use="optional"/>
                                    </complexType>
                                </element>
                            </sequence>
                            <attribute name="id" type="string" use="required"/>
                            <attribute name="class" type="string" use="required"/>
                        </complexType>
                    </element>
                </sequence>
            </complexType>
        </element>
    </schema>
    • config.xml
    <?xml version="1.0" encoding="utf-8"?>
    <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns="http://www.fq.me/context"
           xsi:schemaLocation="http://www.fq.me/context context.xsd">
        <bean id="id1" class="com.fq.benz">
            <property name="name" value="benz"/>
        </bean>
        <bean id="id2" class="com.fq.domain.Bean">
            <property name="isUsed" value="true"/>
            <property name="complexBean" ref="id1"/>
        </bean>
    </beans>

    在这里只是对Schema做简单介绍, 详细内容可以参考W3School Schema 教程.


  • 相关阅读:
    #Kruskal算法 ——求最小生成树 ~20.8.17
    #最小生成树 #Prim算法 ——求最小生成树 ~20.8.15
    #Floyd #多源最短路 ~2020.08.15
    #Bellman-Ford最短路算法 #SPFA(spfa)算法 2020.08.14
    #单源最短路 #Dijkstra 学习心得 20.8.13
    #拓扑序列 学习心得 ~2020.08.13
    96.奇怪的汉诺塔
    95.费解的开关
    94.递归实现排列型枚举
    93.递归实现组合型枚举
  • 原文地址:https://www.cnblogs.com/itrena/p/5926911.html
Copyright © 2020-2023  润新知