概念
XML的全称是EXtensible Markup Language,可扩展标记语言
编写XML就是编写标签,与HTML类似,扩展名.xml
有良好的人机可读性
XML与HTML的比较
XML与HTML非常相似,都是编写标签
XML没有预定义标签,HTML存在大量预定义标签
XML重在保存与传输数据,HTML用于显示信息
XML的用途
Java程序的配置描述文件
用于保存程序的产生的数据
网络间的数据传输
XML文档结构
第一行必须是XML声明
有且只有一个根节点
XML标签的书写规则与HTML相同
XML声明
XML声明说明XML文档的基本信息,包括版本号与字符集,写在XML第一行
version代表版本号,encoding UTF-8设置字符集,用于支持中文
XML标签书写规则
合法的标签名
- 标签名要有意义
- 建议使用英文、小写字母,单词之间使用-分隔
- 建议多级标签之间不要存在重名的情况
适当的注释与缩进
适当的注释与缩进可以让XML文档更容易阅读
合理使用属性
标签属性用于描述标签不可或缺的信息
对标签分组或者为标签设置id时常用属性表示
特殊字符与CDATA标签
标签体中出现<、>特殊字符,会破坏文档结构
两种解决方案:使用实体引用,使用CDATA标签
XML支持五种实体引用
- < < 小于
- > > 大于
- & & 和号
- ' ' 单引号
- " " 双引号
CDATA标签
指的是不应由XML解析器进行解析的文本数据
从“<![CDATA[”开始,到“]]>”结束
有序的子元素
在XML多层嵌套的子元素中,标签前后顺序应保持一致。
XML语义约束
DTD
Document Type Definition,文档类型定义,是一种简单易用的语义约束方式,扩展名为.dtd
定义节点
利用DTD中的<!ELEMENT>标签,可以定义XML文档中运行出现的节点及数量
定义hr节点下只允许出现1个employee子节点
<!ELEMENT hr (employee)>
employee节点下必须包含四个节点,且按顺序出现
<!ELEMENT employee (name,age,salary,department)>
定义name标签体只能是文本,#PCDATA代表文本元素
<!ELEMENT name(#PCDATA)>
定义节点数量
hr节点下最少出现1个employee子节点
<!ELEMENT hr (employee+)>
hr节点下可出现0...n个employee子节点
<!ELEMENT hr (employee*)>
hr节点下最多出现1个employee子节点
<!ELEMENT hr (employee?)>
引用DTD文件
<!DOCTYPE 根节点 SYSTEM "dtd文件路径">
XML Schema
XML Schema比DTD复杂,提供了更多功能
提供了数据类型,格式限定,数据范围等特性
是W3C标准
DOM文档对象模型
Document Object Model定义了访问和操作XML文档的标准方法,DML把XML文档作为树结构来查看,能够通过DOM树来读写所有元素
Dom4j
是一个易用的,开源的库,用于解析XML。它应用于Java平台,具有性能优异、功能强大和极其易使用的特点
Dom4j将XML视为Document对象
XML标签被Dom4j定义为Element对象
代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hr SYSTEM "hr.dtd"><!-- 人力资源管理系统 -->
<hr>
<employee no="3309">
<name>张三</name>
<age>31</age>
<salary>4000</salary>
<department>
<dname>会计部</dname>
<address>XX大厦-B103</address>
</department>
</employee>
<employee no="3310">
<name>李四</name>
<age>23</age>
<salary>3000</salary>
<department>
<dname>工程部</dname>
<address>XX大厦-B104</address>
</department>
</employee>
<employee no="3311">
<name>李铁柱</name>
<age>37</age>
<salary>3600</salary>
<department>
<dname>人事部</dname>
<address>XX大厦-B105</address>
</department>
</employee>
</hr>
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT hr (employee+)>
<!ELEMENT employee (name,age,salary,department)>
<!ATTLIST employee no CDATA "">
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT salary (#PCDATA)>
<!ELEMENT department (dname,address)>
<!ELEMENT dname (#PCDATA)>
<!ELEMENT address (#PCDATA)>
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="hr">
<!-- complexType标签含义是复杂节点,包含子节点时必须使用这个标签 -->
<complexType>
<sequence>
<element name="employee" minOccurs="1" maxOccurs="9999">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age">
<simpleType>
<restriction base="integer">
<minInclusive value="18"></minInclusive>
<maxInclusive value="60"></maxInclusive>
</restriction>
</simpleType>
</element>
<element name="salary" type="integer"></element>
<element name="department">
<complexType>
<sequence>
<element name="dname" type="string"></element>
<element name="address" type="string"></element>
</sequence>
</complexType>
</element>
</sequence>
<attribute name="no" type="string" use="required"></attribute>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
<?xml version="1.0" encoding="UTF-8"?>
<!-- 人力资源管理系统 -->
<hr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="hr.xsd">
<employee no="3309">
<name>张三</name>
<age>31</age>
<salary>4000</salary>
<department>
<dname>会计部</dname>
<address>XX大厦-B103</address>
</department>
</employee>
<employee no="3310">
<name>李四</name>
<age>23</age>
<salary>3000</salary>
<department>
<dname>工程部</dname>
<address>XX大厦-B104</address>
</department>
</employee>
</hr>