zoukankan      html  css  js  c++  java
  • 16.XML语法、CDATA、约束(DTD、Schema)讲解

     xml主要用来描述数据,比如配置文件,网络之间传输数据等,并且在android中也经常用xml来布局,,接下来便来学习xml常用的东西

    1.XML语法

    xml语法分为: 

    1.1 文档声明

    • 必须位于文档第一行,用来声明当前版本、编码格式以及standlane,如果没有编码格式,折则默认为utf-8,比如为<?xml version="1.0" encoding="UTF-8"?>

    1.2 元素

    • 元素可以包含子元素,文本内容,或者元素属性.
    • 元素名称不能以数字、标点或者xml(包括任意大小写)开头,并且不能包含空格和冒号

    比如包含demo文本内容的title元素 :<title>demo</title>

    不包含文本的元素:<title></title>

    1.3 元素属性

    • 一个元素可以有多个属性,每个属性都有它自己的名称name和取值value.
    • 属性值value必须是引号引起来的,并且属性名name不能重复

    比如:<person name="张三">

    1.4 注释

    • 在xml声明之前不能有注释
    • 注释语法为:<!—这是注释-->
    • 注释不能有嵌套,比如这样使用嵌套是出错的: <!—这是注释<!--在嵌套个注释-->-->
    • 在eclipse里可以通过ctrl+shift+/快捷键来快速打出注释

    1.5 CDATA区

    • 位于CDATA 区段中的文本会被解析器忽略,不会去解析
    • CDATA内容不能包含字符串 "]]>"。也不允许嵌套的 CDATA 部分。
    • 标记 CDATA内容结尾的 "]]>" 不能包含空格或换行。
    • CDATA语法为:<![CDATA[   内容  ]]>

    因为在XML元素中, 字符都会被解析器解析出来,像<>&" 这样的字符会被直接报错,示例如下图所示:

     

    所以如果使用元素无法满足数据信息时,则可以通过CDATA来实现,CDATA一般用来存储函数方法,CSS.大量文本等,比如:

    <![CDATA[
        body {
          background: rgb(11,253,216);
        }
    ]]> 

    1.6 转义字符

    由于在XML元素中, 使用<>&" 这样的字符会被直接报错,除了通过CDATA区替代外,我们还可以通过转义字符来实现.

    若要在元素中强制使用,需要转义的字符(包括;)有: 

    • & :   "&amp; ",quotation mark的缩写
    • < :      "&lt; ",less-than的缩写
    • > :   "&gt; ", greater than的缩写
    • "  :  "&quot; ", quote的缩写
    • '  :   "&apos; ",apostrophe的缩写

    示例如下:

     

    2.XML约束

    如果xml格式出现出错,则程序将不能正确获取文件内容,为了保证数据的规范性和安全性,所以可以编写一个约束文档来约束xml的书写规范,约束文档可以规范xml中出现的指定元素名称,属性以及出现的顺序.

    常用的约束有两种:

    • DTD约束      :语法简洁,共能比较单一,如果是外部引用,则编码格式只能为utf-8编码,后缀名为.dtd
    • Schema约束:语法复杂,功能比较强大,后缀名为.xsd,他是新的xml文档约束,替代DTD的

    3.DTD约束

    DTD 可被声明于 XML 文档中,也可作为一个外部引用。

    3.1 声明于 XML 文档

    如果内部使用,则可以直接在文档声明下面写.格式为"<!DOCTYPE 根元素名称 [ 约束内容 ]>"

    示例如下:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE persons [
        <!ELEMENT persons (person+)>
        <!ELEMENT person (年龄,性别,其它信息)>
        <!ELEMENT 年龄 (#PCDATA)>
        <!ELEMENT 性别 (#PCDATA)>
        <!ELEMENT 其它信息 (#PCDATA)>
        <!ATTLIST person
            姓名 ID #REQUIRED
            国籍 (中国|外国) #IMPLIED
            特点 CDATA "吃睡学习"
            动物级别  CDATA  #FIXED  "高级动物"
            >
        <!ENTITY zhangsanMsgUrl "person/id43645.com">
    ]>
    
    <persons>
        <person 姓名="zhangsan" 国籍="中国" >
            <年龄>21</年龄>
            <性别></性别>
            <其它信息>zhangsanMsgUrl </其它信息>
        </person>  
    
        <person  姓名="lisi" 特点="吃喝玩乐" >
            <年龄>21</年龄>
            <性别></性别>
            <其它信息> person/id9945.com </其它信息>
        </person>
    </persons>

    上面的示例,出现了!ELEMENT、!ATTLIST、#REQUIRED等等DTD约束的关键字,接下来我们便来看看这些关键字的作用

    !ELEMENT-元素定义

    ELEMENT关键字用来声明一个XML元素,语法:<!ELEMENT 元素名称  (使用规则)>

    使用规则说明:

    • 以逗号,分开 : 表示该元素里的子元素必须按照顺序来写,所以上面示例的person内的子元素顺序为:年龄,性别,其它信息,如果没有逗号则表示该元素只能包含指定的子                         元素,比如"<!ELEMENT person (年龄)>"表示person元素里只能有"年龄"子元素
    • #PCDATA : 表示元素内容只能是文本,所以上面示例的年龄元素内只能是文本,不能包含子元素.
    • + :   表示子元素至少出现一次,所以上面persons里的person可以有多个.
    • ? :  表示子元素出现0次或1次
    • * :   表示子元素可有可无
    • EMPTY:  表示元素的主体为空
    • ANY:  表示元素的内容为任意类型
    • 以|分开 :  表示子元素任选其一

    !ATTLIST-属性定义

    ATTLIST关键字用来约束某个元素的属性信息语法:

    <!ATTLIST 元素名称
          属性名 属性值类型  约束
          属性名 属性值类型  约束
          ......
    > 

    属性值类型说明

    • ID:  表示属性的取值不能重复(不能与其它相同属性的值一致),不能只写数字
    • 以|分开 :  表示属性值任选其一,如果约束为#IMPLIED时,则可以忽略不用选
    • CDATA:表示属性值为文本字符串。

    约束说明

    • #REQUIRED:  表示该属性必须出现
    • #IMPLIED:  表示该属性可有可无。
    • "字符串":     表示属性的取值为默认值。
    • #FIXED "字符串": 表示该属性的取值为一个固定字符串值

     

    3.2 DTD作为外部引用

    如果在xml中要使用外部文件的DTD约束,则需要在声明下面写入声明的根元素名以及DTD文件名,格式为"<!DOCTYPE 根元素名称  SYSTEM  "文件名称.dtd">"

    示例,将3.1的内部使用改为外部引用 persons.xml文件如下:

    <?xml version="1.0" encoding="utf-8"?>
    "<!DOCTYPE persons  SYSTEM  "persons.dtd">"
    <persons>
             <person 姓名="zhangsan" 国籍="中国" >
                      <年龄>21</年龄>
                      <性别></性别>
                      <其它信息>zhangsanMsgUrl </其它信息>
             </person>      
    
             <person  姓名="lisi" 特点="吃喝玩乐" >
                      <年龄>21</年龄>
                      <性别></性别>
                      <其它信息> person/id9945.com </其它信息>
             </person>
    </persons>

    persons.dtd文件如下:

    <!ELEMENT persons (person+)>
    <!ELEMENT person (年龄,性别,其它信息)>
    <!ELEMENT 年龄 (#PCDATA)>
    <!ELEMENT 性别 (#PCDATA)>
    <!ELEMENT 其它信息 (#PCDATA)>
    <!ATTLIST person
             姓名 ID #REQUIRED
             国籍 (中国|外国) #IMPLIED
             特点 CDATA "吃睡学习"
             动物级别  CDATA  #FIXED  "高级动物"
             >
    <!ENTITY zhangsanMsgUrl "person/id43645.com">

    4.Schema约束

    • XML Schema是基于 XML 的 DTD 替代者
    • XML Schema 符合XML语法结构,并且是可扩展的,后缀名为.xsd(xml schema document)
    • XML Schema更容易地描述允许的文档内容,以及约束定义, 并支持名称空间.

    4.1 示例-创建personSchema.xsd

    在eclipse中,点击File->new->other,然后创建XML Schema File文件,名字为personSchema.xsd.内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"    
    xmlns="http://www.example.org/personSchema"
    targetNamespace="http://www.example.org/personSchema"
    elementFormDefault="qualified">                            <!--讲解1-->
     <xs:element name='persons'>                               <!--约束xml根元素为persons-->
        <xs:complexType>                                       <!--complexType:定义persons为复合元素-->
            <xs:sequence maxOccurs='unbounded '>               <!--讲解2-->
                <xs:element name='person'>                     <!--约束persons下的子元素名字必须为person-->  
                    <xs:complexType>
                       <xs:sequence>                          <!--sequence:必须按照顺序实现:先有姓名,最后年龄.-->
                           <xs:element name='姓名' type='xs:string' />
                           <xs:element name='性别' type='xs:string' />
                           <xs:element name='年龄' type='xs:string' />
                       </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
     </xs:element>
    </xs:schema>

    讲解1:

    xmlns:xs=http://www.w3.org/2001/XMLSchema

    xmlns=http://www.example.org/personSchema

    targetNamespace="http://www.example.org/personSchema"

    讲解2:

    <xs:sequence maxOccurs='unbounded'>

    • sequence表示必须按照顺序实现, maxOccurs='unbounded'表示可以有多个相同的,比如上面就是表示persons里可以有多个person.

     

    4.2 示例-创建对应的XML

    然后在eclips中点击 File->new->other,然后创建XML文件,名字为person.xml,然后点击next,然后选择创建基于schema的XML:

     

    再选择我们刚刚写好的personSchema.xsd:

     

    然后设置文件名为person.xml,且内容如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <p:persons xmlns:p="http://www.example.org/personSchema"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.example.org/personSchema personSchema.xsd ">
      <p:person>
        <p:姓名>p:张三</p:姓名>
        <p:性别>p:男</p:性别>
        <p:年龄>p:22</p:年龄>
      </p:person>
      <p:person>
        <p:姓名>p:李四</p:姓名>
        <p:性别>p:男</p:性别>
        <p:年龄>p:17</p:年龄>
      </p:person>
    </p:persons>

    xmlns:p="http://www.example.org/personSchema"

    • 表明此schema中使用的前缀为p:的元素和数据类型来自于"http://www.example.org/personSchema"名称空间

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    • 指定定义的XML实例名称空间规范格式.默认都以这个2001版本为使用

    xsi:schemaLocation="http://www.example.org/personSchema personSchema.xsd ">

    • 指定我们使用的"http://www.w3.org/2001/XMLSchema"名称空间的约束格式为personSchema.xsd约束文件的内容(也就是说该xml被personSchema.xsd所约束)

    4.3 验证

    如下图所示,假如我们不按照personSchema.xsd约束来写XML,则直接出现error:

    未完待续,下章学习:

    17.JAVA-Dom、Sax解析XML详解

  • 相关阅读:
    php 高并发
    mysql 基础明细
    关于高并发和秒杀系统,你知道的和不知道的一些事
    carbon
    自定义tarbar
    学习小参考
    lnmp1.4,400,500,错误
    PHPSTORM+Thinkphp3.2模板标签替换Thinkphp5.1公式
    Thinkphp5.1手册太简单,有的功能用起来不确定结果是否和预料的一样,顾整理记录
    CentOS7 最小化安装vmware-tools
  • 原文地址:https://www.cnblogs.com/lifexy/p/11410908.html
Copyright © 2011-2022 走看看