XML的全称是EXtensible Markup Language,可扩展标记语言
XML文档结构
有且只有一个根节点。
第一行必须是XML声明。
XML标签的书写规则与HTML相同。
XML声明
XML声明说明XML文档的基本信息,包括版本号与字符集,写在XML第一行。
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
version 必须属性 代表版本号1.0/1.1
encoding 非必须 UTF-8设置字符集,用于支持中文
standalone 非必须 当前xml文件是否依赖其他的xml文件 取值:yes、no
处理特殊字符
标签体中,出现"<"、">"特殊字符,会破坏文档结构。
解决方案1:使用实体引用。
解决方案2:使用CDATA标签。
无效的XML:
<exam>
<question>1+4<3是否正确?</question>
<question>3+5>8是否正确?</question>
</exam>
修改后的XML
<exam>
<question>1+4<3是否正确?</question>
<question>3+5>8是否正确?</question>
</exam>
CDATA标签
1.CDATA指的是不应由XML 解析器进行解析的文本数据
2.从"<![CDATA[" 开始,到"]]>"结束
例如:
<lesson>
<content>
<![CDATA[html中标签的使用:a<body><a href="index.html">首页</a></body>]]>
</content>
</lesson>
页面效果如下:
XML语义约束
XML语义约束有两种定义方式:DTD与XMLSchema。
DTD
1.DTD(Document Type Definition,文档类型定义是)一种简单易用的语义约束方式。
2.DTD文件的扩展名为.dtd。
DTD定义节点
利用DTD中的标签,我们可以定义XML文档中允 许出现的节点及数量,以hr.xml为例:
定义hr节点下只允许出现1个employee子节点。
<!ELEMENT hr (employee)>
employee节点下必须包含以下四个节点,且按顺序出现。
<!ELEMENT employee (name,age,salary,department)>
定义name标签体只能是文本,#PCDATA代表文本元素。
<!ELEMENT name (#PCDATA)>
DTD定义节点数量
如某个子节点需要多次重复出现,则需要在子节点后增加相应的描述符。
hr节点下最少出现1个employee子节点。
<!ELEMENT hr (employee+)>
hr节点下可出现0..n个employee子节点。
<!ELEMENT hr (employee*)>
hr节点下最多出现1个employee子节点。
<!ELEMENT hr (employee?)>
//employee标签内有 name,age,salary,department子标签
<!ELEMENT employee (name,age,salary,department)>
//基本语法:<!ATTLIST 元素名称 属性名称 属性类型 属性约束>
//属性类型 CDATA:字符或数字,普通的字符串;属性约束:#REQUIRED必须的 #IMPLIED属性不是必须的 #FIXED value属性值是固定的
<!ATTLIST employee no CDATA "">
//在DTD中,指定某个标签中的内容是字符数据时,使用(#PCDATA)
//定义name标签体只能是文本,#PCDATA代表文本元素。
<!ELEMENT name (#PCDATA)> ...
XML中引用dtd文件:
在xml文件中使用<!DOCTYPE>标签来引用DTD文件
三种书写格式:
1.引入本地dtd
<!DOCTYPE 根节点 SYSTEM "dtd文件路径">
示例:<!DOCTYPE hr SYSTEM "hr.dtd">
2.在xml文件内部引入
<!DOCTYPE 根节点 [dtd文件内容]>
3.引入网络dtd
<!DOCTYPE 根节点 PUBLIC "DTD文件名称" "DTD文档的URL">
XML Schema
1.XML Schema比DTD更为复杂,提供了更多功能。
2.XML Schema 提供了数据类型、格式限定、数据范围等特性。
Dom4j
Dom4j是一个易用的、开源的库,用于解析XML。它
应用于Java平台,具有性能优异、功能强大和极其易使
用的特点。
Dom4j将XML视为Document对象。
XML标签被Dom4j定义为Element对象
XPath路径表达式
XPath路径表达式是XML 文档中查找数据的语言。
常用的基本表达式
nodename:选取此节点的所有子节点
/:从根节点选取
//:从匹配选择的当前节点选择文档中的节点,而不考虑他们的位置
.:选取当前节点
..:选取当前节点的父节点
@:选取属性