xml语法,约束

1、XML

1.1、xml是什么? 为什么要学习xml?

  • xml(Extensible Markup Language);
  • xml 是一种标记语言,很类似html;
  • xml 是为了存储数据的;
  • xml 没有被预定义,需要自己定义标签;
  • xml 被设计为自我描述性(头标签,尾标签)

1.2、xml 和 html 的区别

  • xml 并不是 html 的替代;
  • xml 是为了存储数据而生;html 是为了显示数据而生;

1.3、xml 的优点

  • 可以对各种编程语言的数据进行管理;
  • 任何平台都能通过解析器读取xml的数据;

1.4、xml 语法

  1. 文档声明
  2. 元素(标签)
  3. 属性
  4. 注释

1.4.1、文档声明

  • 最简单的一种 版本;

    <?xml version="1.0"?>
    
  • 加上encoding属性,说明文档字符编码;

    <?xml version="1.0" encoding="utf-8"?>
    

1.4.2、元素

  • 元素是xml文档内容的基本单元;语法上,一个元素包括一个起始标记,一个结束标记以及标记之间的数据内容

    • Eg:

      <手机>华为手机</手机>
      
  • 元素中还可以嵌套别的元素。在XML文档中,仅有一个根元素,可以有多个子元素,允许出现空元素

1.4.2.1、xml的命名规则

老生常谈,其实每种语言的命名规则几乎都是大差不差的,接下来让我们看一下xml的命名规则

  • 可以含数字,字母和其他符号
  • 不能以数字或标签符号开始
  • 不能以**“xml”**开头
  • 不能有空格
  • 可以用任何名称,没有保留字!
1.4.2.2、xml的语法规则
  • 所有的xml都要有闭标签
  • xml标签对大小写敏感
  • xml标签必须正确嵌套
  • xml文档必须含有根标签 同html语言一样,在声明之后,有个<html></html>的根标签
  • 实体引用
    • &lt; —-> < 小于
    • &gt; —–> > 大于
    • &amp; ——> & &号
    • &apos; —-> ‘’ 单引号
    • &quot —-> “” 双引号

1.4.3、属性

属性? 属性就是用来修饰某个元素的

Eg: 属性名 = 属性值

<users>
    <name id="王大麻子" class="uname"></name>
</users>

​ 关于属性,我们有以下注意点

  • 属性值必须被引号括起来
  • 元素的属性是成键值对的
  • 用来修饰同一个元素的属性的属性名不能相同
  • 属性值不能包含“ & ”,“ ‘ ”,“ < ”

Eg:

<?xml version="1.0" encoding="utf-8"?>
<users>
    <user>
        <name>王五</name>
        <num>001</num>
        <address>汉中</address>
    </user>
    <user>
        <name>李四</name>
        <num>002</num>
        <address>西安</address>
    </user>
    <user>
        <name>赵武</name>
        <num>003</num>
        <address>榆林</address>
    </user>
</users>

1.5、xml约束

1.5.1、何为约束?

在xml技术里,可以编写一个文档来约束一个xml文档的书写规范

那么我们引入xml约束是干什么的呢?

如果我们什么约束都不加,那么用户就可以随意修改,这样好么,很明显,并不好,所以我们就引入了xml约束

1.5.2、约束技术
1.5.2.1、DTD 约束

​ 语法相对简单,功能也相对简单。学习成本也低。

Eg:

约束文件

<?xml version="1.0" encoding="UTF-8" ?>

<!ELEMENT users (user+) >
<!ELEMENT user (name,num,address) >
<!ELEMENT name (#PCDATA) >
<!ELEMENT num (#PCDATA)>
<!ELEMENT address (#PCDATA)>

xml文件

<?xml version="1.0" encoding="utf-8"?>
<!-- 引入dtd约束 -->
<!DOCTYPE users SYSTEM "user.dtd">
<users>
    <user>
        <name>王五</name>
        <num>001</num>
        <address>汉中</address>
    </user>
    <user>
        <name>李四</name>
        <num>002</num>
        <address>西安</address>
    </user>
    <user>
        <name>赵武</name>
        <num>003</num>
        <address>榆林</address>
    </user>
</users>
1.5.2.1.1、引入dtd文件的方式

方法1

  • 外部DTD的引入方式 <!DOCTYPE 文档根结点 SYSTEM “DTD文件的URL”>

  • 外部引入就是我们独立建一个dtd文件, 然后在我们的xml文件中引入

    • Eg: <!DOCTYPE users SYSTEM “user.dtd”>

    • dtd文件

    <?xml version="1.0" encoding="UTF-8" ?>
    <!ELEMENT users (user+) >
    <!ELEMENT user (name,num,address) >
    <!ELEMENT name (#PCDATA) >
    <!ELEMENT num (#PCDATA)>
    <!ELEMENT address (#PCDATA)>
    

    xml 文件

    <?xml version="1.0" encoding="utf-8"?>
    <!-- 引入dtd约束 -->
    <!DOCTYPE users SYSTEM "user.dtd">
    <users>
        <user>
            <name>王五</name>
            <num>001</num>
            <address>汉中</address>
        </user>
        <user>
            <name>李四</name>
            <num>002</num>
            <address>西安</address>
        </user>
        <user>
            <name>赵武</name>
            <num>003</num>
            <address>榆林</address>
        </user>
    </users>
    
  • 文档根结点 指的是当前xml中的根标签。
    SYSTEM  引入的系统中存在文件
    "DTD文件的URL" DTD存放的位置
    

方法2

  • 引入公共的dtd文件 <!DOCTYPE 文档根结点 PUBLIC “DTD名称” “DTD文件的URL”>

  • Eg: <!DOCTYPE users PUBLIC "user “user.dtd”>

    • dtd文件
    <?xml version="1.0" encoding="UTF-8" ?>
    <!ELEMENT users (user+) >
    <!ELEMENT user (name,num,address) >
    <!ELEMENT name (#PCDATA) >
    <!ELEMENT num (#PCDATA)>
    <!ELEMENT address (#PCDATA)>
    
    • xml文件
    <?xml version="1.0" encoding="utf-8"?>
    <!-- 引入dtd约束 -->
    <!DOCTYPE users PUBLIC "user" "user.dtd">
    <users>
        <user>
            <name>王五</name>
            <num>001</num>
            <address>汉中</address>
        </user>
        <user>
            <name>李四</name>
            <num>002</num>
            <address>西安</address>
        </user>
        <user>
            <name>赵武</name>
            <num>003</num>
            <address>榆林</address>
        </user>
    </users>
    
  • PUBLIC  表示当前引入的DTD是公共的DTD
    

方法3 在xml文件中直接写dtd

  • Eg:

    <?xml version="1.0" encoding="utf-8"?>
    <!-- 引入dtd约束 -->
    <!DOCTYPE users[
            <!ELEMENT users (user+) >
            <!ELEMENT user (name,num,address) >
            <!ELEMENT name (#PCDATA) >
            <!ELEMENT num (#PCDATA) >
            <!ELEMENT address (#PCDATA) >
            ]>
    <users>
        <user>
            <name>王五</name>
            <num>001</num>
            <address>汉中</address>
        </user>
        <user>
            <name>李四</name>
            <num>002</num>
            <address>西安</address>
        </user>
        <user>
            <name>赵武</name>
            <num>003</num>
            <address>榆林</address>
        </user>
    </users>
    
1.5.2.1.2、dtd语法
  1. 元素

    • 当定义DTD约束xml时候,这时需要在DTD中使用ELEMENT来定义当前xml中可以出现的标签名称。
      格式:
      <!ELEMENT 标签名 约束> 约束来限定当前标签中可以有的子标签,或者当前标签中可以书写的内容
      在定义标签名的时候,约束中可以使用一些符号标签具体出现次数

      ?    零次或者一次
      
      \*   零次或者多次
      
       \+     一次或者多次   users (user+)   表示当前的users标签下可以有一个或者多个user标签
       
       ,     用来限定当前的子标签出现的顺序user (name,age,addr)  user标签下只能有name age addr 子标签,并且必须按照name  age  addr的顺序书写
       
       |    user (name|age,addr) user下可以name或者age ,但必须有addr,并且addr必须name或age后面
       
       #PCDATA         表明该元素可包含任何字符数据,但不能在其中包含任何子元素。只有 PCDATA 的元素通过圆括号中的 #PCDATA 进行声明
       
       EMPTY       表明该元素不能有任何子元素或文本,仅可以使用属性。
       
       ANY            表该元素中可以包含任何DTD中定义的元素内容 如:<!ELEMENT note ANY>
       
       <!ELEMENT age EMPTY >  当前的age标签是个空标签,它不能有文本内容。
      
      
  2. 属性

    在xml中的标签上是可以书写属性的,在DTD中就需要对属性进行约束。
    格式:
    <!ATTLIST 标签名 属性名 属性的类型  属性的约束>
    如果一个标签上有多个属性
    <!ATTLIST 标签名 属性名 属性的类型  属性的约束
                                      属性名 属性的类型  属性的约束
      属性名 属性的类型  属性的约束
    >
    
    <标签名 属性1=””  属性2=””  属性3=”” >
    
    属性的类型:
    CDATA  属性的value值可以是文本数据
    (值1 | 值2 | 值3....   )  表示当前的属性的value值只能是当前括号中的值
    ID 表示唯一。对当前标签上的id属性进行限定,并且同一个xml中id不能重复
     
    类型    描述
    CDATA    值为字符数据 (character data)
    (en1|en2|..)    此值是枚举列表中的一个值
    ID    值为唯一的 id
    IDREF    值为另外一个元素的 id
    IDREFS    值为其他 id 的列表
    NMTOKEN    值为合法的 XML 名称
    NMTOKENS    值为合法的 XML 名称的列表
    ENTITY    值是一个实体
    ENTITIES    值是一个实体列表
    NOTATION    此值是符号的名称
    xml:    值是一个预定义的 XML 值
    
    属性的约束:
    REQUIRED 属性是必须书写的
    Implied 属性是可选得
    #fixed value 属性的value是固定的值   
    “值”  代表属性的默认值
    user name CDATA  fixed “zhangsan”
    <user name=”zhangsan”>
    user name CDATA “张三”
    <user />
    
    属性的类型和约束的组合:
    CDATA   REQUIRED
    CDATA   Implied
    CDATA   fixed
    CDATA  “值” 
    (值1 | 值2 | 值3....   )  REQUIRED
    ID   REQUIRED
    
  3. 实体

    实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
    在DTD定义中,一条<!ENTITY …>语句用于定义一个实体。
    实体可以理解成Java中预先定义好的一个常量,然后xml文件中就可以引入当前这个定义的实体。
    
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE users[
        <!ELEMENT users (user+) >    
        <!ELEMENT user (name,age,addr) >    
        <!ELEMENT name (#PCDATA) >    
        <!ELEMENT age EMPTY >    
        <!ELEMENT addr (#PCDATA) >    
        <!ATTLIST user id ID #REQUIRED >
        <!ENTITY  abc "地球村">
    ]>
    <users>
        <user id="u001">
            <name>zhangsan</name>
            <age></age>
            <addr>&abc;</addr>
        </user>
        <user id="u002">
            <name>lisi</name>
            <age/>
            <addr>&abc;</addr>
        </user>
    </users>
    
1.5.2.2、Schema约束

​ 语法相对复杂,功能也相对强大。学习成本相对高.

​ 参考 : https://www.cnblogs.com/cb0327/p/4967782.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值