XML介绍与用途
什么是XML
- XML的全称是E
X
tensibleM
arkupL
anguage,可扩展标记语言。 - 编写XML就是编写标签,与HTML非常类似,扩展名
.xml
。 - 良好的人机可读性。
<employee>
<name>张三</name>
<age>31</age>
<height>178</height>
</employee>
XML与HTML的比较
- XML与HTML非常相似,都是编写标签。
- XML没有预定义标签,HTML存在大量预定义标签。
- XML重在保存和传输数据,HTML用于显示信息。
XML用途
- Java程序的配置描述文件。
- 用于保存程序产生的数据
- 网络间的数据传输
XML的文档结构
- 第一行必须是XML声明;
- 有且仅有一个根节点;
- XML标签的书写规则与HTML相同。
XML声明
- XML声明说明了XML文档的基本信息,包括版本号与字符集,写在XML第一行。
<?xml version="1.0" encoding="UTF-8"?>
<!-- 版本号常见为1.0/1.1 -->
<!-- UTF-8字符集,用于支持中文 -->
XML语法检查方法
- 使用浏览器可以直接检查XML文件,直接把XML文件拖入浏览器就可以了。
XML的语法规则
合法的标签名
- 标签名要有意义;
- 建议标签名使用英文小写字母,单词直接使用”-“进行分割;
- 建议多级标签之间不要存在重名的情况。
适当的注释与缩进
- 适当的注释与缩进可以让XML文档更容易阅读
合理使用属性
- 标签属性用于描述标签不可或缺的信息;
- 对标签分组或者为标签设置Id时常用属性表示;
- 唯一的身份信息一般作为属性表示。
处理特殊字符
标签体中,出现
<``>
等字符,会破坏文档结构,使文件没有办法被正确解析。解决方案1:使用实体引用;
解决方案2:使用CDATA标签。
- CDATA指的是不应由XML解析器解析的文本数据
- 从
<![CDATA[
开始,到]]>
结束
有序的子元素
- 在XML多层嵌套的子元素中,标签前后顺序应该保持一致,这是约定俗成的表达方法,虽然不这样写不会出现错误,但不利于阅读。
XML语义约束
- XML文档结构正确,但可能不是有效的。
- XML语义约束就是用于规定XML文档中允许出现哪些元素
- XML语义约束有两种定义方式:DTD和XML Schema
Document Type Definition
- DTD(Document Type Definition,文档类型定义)是一种简单易用的语义约束方式;
- DTD文件的扩展名为.dtd。
<!-- 定义了hr节点下只允许出现1个employee子节点 -->
<!ELEMENT hr(employee)>
<!-- employee节点下必须包含以下四个节点,且按顺序出现 -->
<!ELEMENT employee(name,age,salary,department)>
<!-- 设置节点属性值 节点名称 属性名称 值的类型 默认值 -->
<!ATTLIST employee no CDATA "">
<!-- 定义name标签体只能是文本,#PCDATA代表文本元素 -->
<!ELEMENT name(#PCDATA)>
DTD定义结点及节点数量
- 利用DTD中的
<!ELEMENT>
标签,我们可以定义XML文档中允许出现的节点及数量。 - 如果某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符。
<!-- hr节点下最少出现1个employee子节点 -->
<!ELEMENT hr(employee+)>
<!-- hr节点下出现0~n个employee子节点 -->
<!ELEMENT hr(employee*)>
<!-- hr节点下最多出现1个employee子节点 -->
<!ELEMENT hr(employee?)>
XML引用DTD文件
- 在XML中使用
<!DOCTYPE>
标签来引用DTD文件
<!-- 书写格式 -->
<!DOCTYPE 根节点 SYSTEM "dtd文件路径">
<!-- 示例: -->
<!DOCTYPE hr SYSTEM "hr.dtd">
XML Schema
- XML Schema比DTD更复杂,提供了更多的功能;
- XML Schema提供了数据类型、格式限定、数据范围等特性;
- XML Schema是W3C标准。
<?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="unbounded">
<complexType>
<sequence>
<element name="name" type="string"/>
<element name="age" type="integer"/>
<element name="salary" type="integer"/>
<element name="department">
<complexType>
<sequence>
<element name="dname" type="string"/>
<element name="address" type="string"/>
</sequence>
</complexType>
</element>
</sequence>
<attribute name="no" type="string" use="required"/>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
Java解析XML
- DOM(Document Object Model)定义了访问和操作XML文档的标准方法,DOM把XML文档作为树结构来查看,能够通过DOM树来读写所有元素。
Dom4j
- Dom4j是一个易用的、开源的库,用于解析XML。它应用于Java平台,具有性能优异、功能强大和极其易使用的特点。
- Dom4j将XML视为
Document
对象。 - XML标签被Dom4j视为
Element
对象
XPath路径表达式
- XPath路径表达式是XML文档中查询数据的语言;
- 掌握XPath可以极大得提高在提取数据时的开发效率;
- 学习XPath本质就是掌握各种形式表达式的使用技巧。
Jaxen介绍
- Jaxen是一个Java编写的开源的XPath库。这是适应多种不同那个的对象模型,包括DOM,XOM,dom4j和JDOM。
- Dom4j底层以来Jaxen实现XPath查询
- Jaxen下载地址:jaxen.codehaus.org
- xpath实例代码
xpt.xpath("/hr/employee"); //显示根节点下的所有员工
xpt.xpath("//employee"); //显示所有员工
xpt.xpath("//employee[salary<4000]"); //显示工资小于4000的员工
xpt.xpath("//employee[name='李铁柱']"); //显示姓名为李铁柱的员工
xpt.xpath("//employee[@no=3310]"); //显示工号为3310的员工
xpt.xpath("//employee[1]"); //显示第一名员工
xpt.xpath("//employee[last()]"); //显示最后的一名员工
xpt.xpath("//employee[position()<6]"); //显示前六名员工
xpt.xpath("//employee[3] | //employee[8]"); //同时显示第3名和第8名员工