XML详细讲解(在java需掌握的程度)<一>:如何写XML文件——DTD约束&Schema约束

一,XML简介·

xml全称为 extensible markup language,可扩展性标记语言,所有浏览器都有xml的解析引擎,测试xml文件时,可直接在浏览器中执行。xml主要用来存储数据和传输数据(而非展示数据),是两个服务器进行数据交互的一种方式。

二,XML基本语法规范

1,文件的扩展名是.xml;

2,文件的第一行必须是<?xml version="1.0" encoding="utf-8" ?>,(其中可包含一些属性值);

3,xml中只能有一个根标签,同时标签严格区分大小写,以及每个标签须有结束标签;

4,xml文件中为自定义标签;

范例:演示xml文件的基本格式(bookstore.xml)

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book id="a1">
        <name>水浒传</name>
        <author>施耐庵</author>
        <price>60</price>
    </book>
</bookstore>

三,XML基础知识

<一>xml注释:

                                <!-- 注释内容 -->

<二>文档声明的属性值:

           1,所有的属性值必须用英文双引号括起来;

           2,version:版本号,目前流行的任然是1.0;

           3,encoding:声明编码格式;

           4,standalone:说明文档是否独立,即是否依赖于其他文档;

<三>实体:

         xml文件不能解析特殊字符,如<,>,=等等,同时对表达式不做处理,仅仅存储它们;因此在xml中有一套对应的实体转换规则:

最常用的转义字符列表
字符  说明        实体
      空格	      &nbsp;	
<	  小于	      &lt;	
>	  大于	      &gt;
&	  &符号	      &amp;
"	  双引号	  &quot;	
©	  版权	      &copy;	
®	  已注册商标	  &reg;	
™	  商标(美国) &trade;	
×	  乘号	      &times;	
÷	  除号	      &divide;

<四>自定义标签规范

          1,不能以数字或标点符号开始;

          2,名称不可以包含数字和其他字符;

          3,不能以xml开始;

          4,不可以包含空格;

<五>专业术语与xml文件的数据结构

         xml数据是以树结构来进行存储的,根节点又称为根元素,即根标签,从根节点往下,依次称为一级元素,二级元素,元素(element)也可称为节点(node)

    

四,约束文档

      如果没有约束,我们的数据将会非常混乱无章,如下面的一个xml文件:

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book id="a1">
        <name>水浒传</name>
        <author>施耐庵</author>
        <price>60</price>
    </book>
    <book id="a2">
        <name>红楼梦</name>
        <author>曹雪芹</author>
        <price></price>
        <remark>读此书获益匪浅</remark>
    </book>  
</bookstore>

上面的书没有remark标签,但是下面的书却有,而且《红楼梦》没有写明价格。这种数据不一致的情况需要我们使用一个约束来规范我们的数据。xml有两种约束:DTD约束和Schema约束。

<一>DTD约束

       DTD,Document Type Difinition,文档约束,这种约束是使用最广泛的约束(时间原因),但是功能不如Schema约束。

1,DTD约束类型

       有两种约束,一种是将约束写在一个文件扩展名为.dtd中,然后通过在xml文件中引入外部DTD约束,一种是直接在xml文件中写DTD约束。

2,DTD约束语法(以范例讲解)

        <1> 约束写在一个文件扩展名为.dtd中

               小编为了方便读者的阅读,对重点进行了标红。这是一个bookstore.dtd文件:

<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT bookstore (book+)>
<!ELEMENT book (name,author,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!--注意只有一种数据类型:字符串-->
<!ELEMENT price (#PCDATA)>
<!--注意id必须以字母开头  -->
<!ATTLIST book id ID #REQUIRED>

下面讲解上述范例:

@约束语法的基本格式是:<!ELEMENT  元素> 

@第一行:.dtd文件本质还是一个xml文件,因此第一行代码任然是不变的;

@第二行:对根元素进行约束,约束了根元素的子元素有哪些,每个子元素出现的个数(默认为一次)————  <!ELEMENT  根元素  (子元素,子元素......)>

每个子元素后可跟数量字符:

+    1~n次
?   0~1次
*    0~n次

@第三行:对一级子元素进行约束,约束一级子元素的元素(即二级元素)有哪些以及可出现次数

@第四行~~第六行:对二级元素进行约束,约束了数据类型,在DTD约束中只有一种类型,即PCDATA,字符串类型(另外的一种是声明为 ANY,ANY声明的元素可包含可解析数据组合,其语法格式为  <!ELEMENT  元素  ANY>)。————  <!ELEMENT  元素  (#PCDATA)>,这儿也可进行嵌套,即在括号()中写三级元素。

@第七行:这一行是对book元素的属性进行约束,属性约束语法格式如下:

              <!ATTLIST 元素名称 属性名称 属性类型 默认值>

属性类型及默认值见下表(常用的塔配是 ID+#REQUIRED):

常用的属性类型
CDATA值为字符数据(字符串)
(en1|en2|...)值为枚举列表中的一个
ID值为唯一的id,不能重复,不能以数字开头
所有默认值
属性的默认值
#REQUIRED属性值是必须的
#IMPLIED属性值不是必须的
#FIXED  value属性值是所给定的值

         <2>直接在xml文件中写DTD约束

            语法格式(写在xml文档的第二行): <!DOCTYPE 根元素[  <!--这儿写约束-- >  ]>

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE bookstore [
    <!ELEMENT bookstore (book+)>
    <!ELEMENT book (name,author,price)>
    <!ELEMENT name (#PCDATA)>
    <!ELEMENT author (#PCDATA)>
    <!--注意只有一种数据类型:字符串-->
    <!ELEMENT price (#PCDATA)>
    <!--注意id必须以字母开头  -->
    <!ATTLIST book id ID #REQUIRED>
]>
<bookstore>
    <book id="a1">
        <name>水浒传</name>
        <author>施耐庵</author>
        <price>60</price>
    </book>
    <book id="a2">
        <name>红楼梦</name>
        <author>曹雪芹</author>
        <price>75</price>
    </book>
    <book id="a3">
        <name>悲惨世界</name>
        <author>雨果</author>
        <price>30</price>
    </book>
</bookstore>

3.引入外部DTD文档约束

        当在外部写好约束后,需要将约束引入需要约束的xml文件(写在第二行),有两种引入方式。

       <1>引入本地外部文件约束:

     语法: <!DOCTYPE  根标签 SYSTEM  "DTD文件位置">

       <2>引入网上的外部文件:

     语法:<!DOCTYPE 根标签  PUBLIC  "DTD文件名"  "DTD文件所在地址"> 

<二>Schema约束

       Schema约束便不是为了替代DTD而出生的,只是作为优化完善而诞生的。Schema约束功能相比DTD是非常强大的存在,然而强大的东西就会很复杂。Schema约束相比DTD约束有以下优势

①面向对象,可以继承,扩展;②能够对数据详细的约束,以及元素出现的顺序,次数,还支持正则表达式等·;③支持命名空间,在不同的命名空间可以有重复元素。

       Schema约束只能写在外部文件中,且文件扩展名为.xsd。

       为了方便读者快速入门掌握,小编依旧以范例讲解。

 1,对Schema头部约束的讲解

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://www.example.org/students" 
        xmlns:tns="http://www.example.org/students" 
        elementFormDefault="qualified">
</schema>

          第一行代码无需多言。第二行中现在来依次讲解。

         <1>  xmlns="http://www.w3.org/2001/XMLSchema"   :   显示schema约束中用到的元素和数据类型来自命名空间“http://www.w3.org/2001/XMLSchma”,有时这行代码也会写成——————“xmlns:xs="http://www.w3.org/2001/XMLSchema"”,显示schema约束中用到的元素和数据类型来自命名空间“http://www.w3.org/2001/XMLSchma”,同时元素名前需带有前缀 xs:。(此行代码固定)

         <2>targetNamespace="http://www.example.org/students"  :  声明被此schema定义的元素属于命名空间"http://www.example.org/students",注意只是声明,而不能说明当前schema默认使用该命名空间。(example部分可自己写,students是根标签名)

         <3>xmlns:tns="http://www.example.org/students"  : 默认命名空间。

         <4>elementFormDefault="qualified"  :  指出任何XML实例文档所使用的且在此schema中声明过的元素必须被命名空间限定。(此行代码固定)

2,Schema约束的具体约束

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
targetNamespace="http://www.yby.org/students" 
xmlns:tns="http://www.yby.org/students" 
elementFormDefault="qualified">
<element name="students">
   <complexType>
       <sequence>
           <element name="student" minOccurs="1" maxOccurs="unbounded">
             <complexType>
               <sequence>         
               <element name="name" type="string" minOccurs="1" maxOccurs="1"/>
               
               <element name="sex">
                   <simpleType>
                       <annotation>
                           <documentation>只能为男或者女</documentation>
                       </annotation>
                       <restriction base="string">
                           <enumeration value="男"/>
                           <enumeration value="女"/>                       
                       </restriction>
                   </simpleType>
               </element>
               
               <element name="age" minOccurs="1" maxOccurs="1">
                   <simpleType>
                       <annotation>
                           <documentation>年龄必须在15~50岁</documentation>
                       </annotation>
                       <restriction base="int">
                           <minInclusive value="15"/>
                           <maxInclusive value="50"/>
                       </restriction>
                   </simpleType>
               </element>
                             
               <element name="subjects" minOccurs="1" maxOccurs="1">
                   <complexType>
                       <sequence>
                       <element name="subject" minOccurs="1" maxOccurs="3" type="string">
                           <annotation>
                              <documentation>主修科目最少为一门,最多为三门</documentation>
                           </annotation>                         
                       </element>
                       </sequence>
                   </complexType>
               </element> 
                
             </sequence>
             <!--注意属性约束的位置 -->
           <attribute name="id" type="int" use="required"/>           
           </complexType>
          </element>                                  
       </sequence>
   </complexType>   
</element>
</schema>

      <1>标签讲解

      ①<complexType>&<simpleType>:当一个元素(称为A)的子元素(称为B)存在子元素(称为C)时(好绕口,哈哈哈),必须使用<complexType>标签包裹元素B,如果不满足上述条件则必须使用<simpleType>包裹元素B。

      ②<sequence>&<all>&<choice>:<sequence>表示元素出现的顺序必须是schema约束中的顺序;<all>表示元素可以以任意顺序出现;<choice>表示简单元素只能出现一个。

      ③<annotation>&<documentation>:<annotation>包裹部分表示注解,<documentation>包裹部分为注解内容。

      ④<restriction>:此标签包裹用来写限制内容。

      ⑤<maxInclusive value="max"/>&<minInclusive value="min"/>:约束范围为min~max。

      ⑥<enumeration value="/>:约束值只能为枚举值中的一个。

      ⑦<attribute>:给指定的元素加入属性约束。

      <2>数据类型&数量约束

      ①数据类型有很多种,如string,int,Integer等等,注意的是,在element标签中是写type,在restriction标签是写base。

      ②数量约束:minOccurs约束标签最少出现的次数,maxOccurs约束标签最多出现的次数,其中unbounded表示无穷次。

       <3>属性:要给哪个元素添加属性约束就必须在属于该元素的部分的使用<attribute>标签来约束,其中use="required",表示属性是必须的,没有就会报错。

3,引入Schema约束

        在xml文件的第二行写下面的代码:

<node xmlns="http://www.w3cschool.com.cn" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://www.w3cschool.com.cn note.xsd ">  

<!--node 写根元素名称-->
<!--xmlns="http://www.w3cschool.com.cn"   这一行写schema约束中的targetNamespace的地址 -->
<!--xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   这一行代码不变  -->
<!--xsi:schemaLocation="http://www.w3cschool.com.cn note.xsd "   这一行代码中地址写schema约 
     束文档的 xmlns:tns=  的地址,note.xsd 是Schema约束文档的文件名 -->

      这一期写了四个小时,希望能给读者带来帮助,也希望兄弟们给小编点支持!!!下一期写如何解析XML文档!!!

     

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Avalon712

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值