XML概述


文章目录

  • XML概述
  • 一、什么 是XML
  • 二、XML和HTML
  • 三、XML语法
  • 1.文档声明
  • 2.元素定义
  • 3.属性定义
  • 四、DTD
  • 1.什么是约束
  • 2.DTD约束
  • 3.DTD的引入
  • 4.DTD语法
  • (1)元素定义
  • (2)属性定义
  • (3)属性类型


一、什么 是XML

由于不同语言之间数据传递的格式有可能不兼容,导致这些项目在数据传输时变得很困难,因此W3C组织退出一种新的数据交换标准–XML,是一种通用的数据交换格式。

所以XML的作用是用于两个程序间进行通信,并且当服务器程序启动时,去读取它应当监听的端口号,还有连接数据库的用户名和密码,充当小型的数据库。

通常XML文件保存这种具有树状结构的数据是最好的选择。

XML是一种类似于HTML的标记语言,称为可扩展标记语言。可扩展就是指用户可以按照xml的规则自定义标记

二、XML和HTML

(一)HTML用于显示数据,但是XML用于存储和传输数据

(二)HTML没有区分大小写,XML是严格区分大小写的。

(三)HTML可以有多个根,但格式良好的XML只允许一个根

(四)HTML的标记是预定义的,但XML的标记是自己定义的。

三、XML语法

1.文档声明

完整的xml文档中,必须包含一个xml文档的声明,并且声明必须位于文档的第一行。

声明语法如下:

<?XML版本信息 【编码信息】【文档独立性信息】?>

表明了该文档是xml文档以及遵循了哪个版本

格式为:<? 内容 ?>中间声明版本,编码信息文档独立性信息

**<?xml version="1.0" encoding="UTF-8"? standalone=“yes”>**

默认情况下,standalone的值为“no”,表示文档依赖于外部文档。

2.元素定义

<城市 地点="中山">
  <学校>初中,高中,大学</学校>
  <超市>
    <书>
      <书名>xxx</书名>
      <作者 姓名="某某某"></作者>
      <售价 单位="元"></售价>
    </书>
  </超市>
</城市>

<学校>:元素 姓名=“某某某”:属性

一般来说,元素是由标记、属性、元素内容、结束标语(</学校>)组成。

3.属性定义

可以自定义属性,但是属性的命名规范同元素时,属性值必须用“”(双引号)或“(单引号),否则视为错误。注释用<!-- xxx -->

四、DTD

1.什么是约束

<城市 地点="中山">
<学校>初中,高中,大学</学校>
<超市>
  <书>
    <书名>xxx</书名>
    <作者 姓名="某某某"></作者>
    <售价 单位="元">68</售价>
    <售价 单元="元">45</售价>
  </书>
</超市>
</城市>

像上面的XML文档结构正确,但同时出现两种售价,所以在XML文档定义了约束规则,用来约束文档内容。最常用的是DTD约束和Schema约束。

2.DTD约束

<?xml version="1.0" encoding="UTF-8"?>
  <书架>
    <书>
      <书名>hello、java</书名>
      <作者>xxx</作者>
      <价格>45</价格>
    </书>
    <书>
      <书名>c++</书名>
      <作者>xxxx</作者>
      <价格>23</价格>
    </书>
  </书架>

表2——2

<!DOCTYPE 书架[
    <!ELEMENT 书 (#PCDATA)>
    <!ELEMENT 书架 (书+)>
    <!ELEMENT 书编号 (#PCDATA)>
    <!ELEMENT 书名 (#PCDATA)]>

表2-3(shu.dtd)

表2-2中的XML文档是根据shu.dtd所规定的约束进行编写。对shu.dtd的解析如下

(1)第一行<!LEMENT ...>定义了一个元素,其中“书架”是元素名称,“(书+)”指书架有1~n个书元素

(2)”书(书名,作者,售价)“表示元素”书“包含”书名“、”作者“、”售价“三个子元素,并且需要按照顺序依次出现。

(3)3~5行“(#PCDATA)”表示元素中嵌套的内容是普通的文本字符串。

3.DTD的引入

在XML文档中引入外部DTD文件有两种方法:

<!DOCTYPE 根元素名称 SYSTEM "外部DTD文件的URI">
<!DOCTYPE 根元素名称 PUBLIC "DTD名称">

例如上面的外部应用格式为

如果引用本地的DTD,则使用的是第一行的声明语句,引入公共的DTD文件则使用PUBLOIC。

如:

<!DOCTYPE web-app PUBLIC
        "-//Sun Microsystems,Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2.3.dtd">

第二行是指DTD名称。

DTD对XML文档的约束,除了外部引入方式实现外,还可以采用内嵌如:

<!DOCTYPE 书架[
    <!ELEMENT 书架 (书+)>
    <!ELEMENT 书编号 (#PCDATA)>
    <!ELEMENT 书 (书编号) >
    <!ATTLIST 书编号 编号 ID #REQUIRED>]>

后面再加上XML文档的自定义元素内容。

通常采用外部引用的方式约束XML文档,避免重复被多个XML引用。也方便维护和管理。

4.DTD语法

(1)元素定义

<!ELEMENT 元素名称 元素内容>

“元素名称”为自定义,“元素内容”包括数据类型和符号两部分,包括五种内容形式,具体如下。

(1)#PCDATA表示嵌套内容为普通文本字符串

(2)子元素:如<!ELEMENT 书名 (书名,售价,作者)>

(3)混合内容:表示可以包含字符数据,也可以包含子元素,<!ELEMENT 书名(#PCDATA)*> 表示书中嵌套的子元素书名包含0~n,且书名为字符串文本格式。

(4)EMPTY:表示既不包含字符数据,也不包含子元素。是一个空元素

(5)ANY:表示可以包含任何的字符数据和子元素,但应该尽量避免使用,因为除了根元素外,其他使用的都会失去约束效果。

(2)属性定义

DTD属性定义的基本语法格式如下:

<!ATTLIST 元素名
        属性名1 属性类型 设置说明
        属性名2 属性类型 设置说明
        ......>

设置说明的类型如下:

1.#PEQUIRED:表示该属性是必须的

#FIXED:表示固定的属性默认值

#IMPLIED: 表示元素可以包含或者不包含该属性

默认值:如果元素不包含该属性则被自动设置为默认值

(3)属性类型

一共有10种,常用的为

(1)CDATA:字符数据与#PCDATA相同,

(2)Enumerated(枚举):通常省略,如:

<!ATTLIST 肉 品种 (鸡肉|牛肉|猪肉|鱼肉)"鸡肉">

默认值为“鸡肉”,即没有“品种”这个属性,且取值为“鸡肉”。

(3)ID

ID的属性必须为#IMPLIED或#REQUIRED 例如:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 书架[
        <!ELEMENT 书架 (书+)>
        <!ELEMENT 书编号 (#PCDATA)>
        <!ELEMENT 书 (书编号) >
        <!ATTLIST 书编号 编号 ID #REQUIRED>]>
<书架>
  <书>
    <书编号 编号="id1">1</书编号>
  </书>
  <书>
    <书编号 编号="id2">2</书编号>
  </书>
</书架>

(4)IDREF和IDREFS

如上面代码所示,虽然俩本书的编号唯一,但是ID是属性没有发挥作用,

<!DOCTYPE 书架[
    <!ELEMENT 书架 (书+)>
    <!ELEMENT 书编号 (#PCDATA)>
    <!ELEMENT 书名 (#PCDATA)>
    <!ELEMENT 书 (书编号,书名) >
    <!ATTLIST 书编号 编号 ID #REQUIRED
               第几本 IDREF #IMPLIED>]>
<书架>
    <书>
        <书名 第几本="id1">明朝那些事儿1</书名>
        <书编号 编号="id1">1</书编号>
    </书>
    <书>
        <书名 第几本="id2">明朝那些事儿2</书名>
        <书编号 编号="id2">2</书编号>
    </书>
</书架>

如上述,给书加上第几本的属性,该属性的类型设置为IDREF,IDREF属性的值必须赋给一个已经存在的ID类型,如此一来“id1”为第一本《明朝那些事儿1》,“id2”为《明朝那些事儿2》,这样子俩本书之间就有了联系,

IDREF表示一对一的关系,但是IDEEF表示一对多的关系,例如有学生同时借了“id1”和“id2”这两本书,

<!DOCTYPE 书架[
    <!ELEMENT 书架 (书+)>
    <!ELEMENT 书编号 (#PCDATA)>
    <!ELEMENT 书名 (#PCDATA)>
    <!ELEMENT 书 (书编号,书名) >
    <!ELEMENT 学号 (#PCDATA)>
    <!ELEMENT person EMPTY>
    <!ELEMENT person borrow IDREFS #REQUIRED>
    <!ELEMENT data (#PCDATA)>
    <!ELEMENT 学生 (data,person) >
    <!ATTLIST 书编号 编号 ID #REQUIRED
            第几本 IDREF #IMPLIED>]>
<图书馆>
    <书架>
        <书>
            <书名 第几本="id1">明朝那些事儿1</书名>
            <书编号 编号="id1">1</书编号>
        </书>
        <书>
            <书名 第几本="id2">明朝那些事儿2</书名>
            <书编号 编号="id2">2</书编号>
        </书>
    </书架>
    <学生>
        <data>2022-3-9</data>
        <person name="张三" borrow="id1 id2"></person>
    </学生>
</图书馆>

除上面这些属性类型外,DTD约束还有NMTOKEN,NMTOKEMS,NOTATION,ENTIITY,ENITITYS这几种。