介绍
是什么
XML 指可扩展标记语言(eXtensible Markup Language)
干什么
XML 被设计用来传输和存储数据.
XML 经常被用于充当配置文件.
特点
XML 指可扩展标记语言(EXtensible Markup Language)
XML 是一种很像HTML的标记语言
XML 的设计宗旨是传输数据,而不是显示数
XML 标签没有被预定义。您需要自行定义标签
XML 被设计为具有自我描述性
XML 和 HTML 之间的差异
XML 不是 HTML 的替代。
XML 和 HTML 为不同的目的而设计:
XML 被设计用来传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。
HTML 旨在显示信息,而 XML 旨在传输信息。
语法
a) 声明信息, 用于描述 xml 的版本和编码方式
b) xml 有且仅有一个根元素
c) xml 是大小写敏感的
d) 标签是成对的, 而且要正确嵌套
e) 属性值要使用双引号
f)使用DTD或XSD定义约束
< < less than
> > greater than
& & ampersand
' ' apostrophe
" " quotation mark
注释:在 XML 中,只有字符 "<" 和 "&" 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。
练习
使用XML描述下表中的学生成绩信息,XML文件定义为scores.xml
ID | 姓名 | 课程 | 成绩 |
1 | 刘备 | 《三分天下》 | 66 |
2 | 曹操 | 《枭雄》 | 90 |
<?xml version="1.0" encoding="UTF-8"?>
<scores>
<student id="1">
<name>刘备</name>
<course>《三分天下》</course>
<score>66</score>
</student>
<student id="2">
<name>曹操</name>
<course>《枭雄》</course>
<score>90</score>
</student>
</scores>
DTD
DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块。
DTD 可被成行地声明于 XML 文档中,也可作为一个外部引用。
DTD 可以分为两种, 内部 DTD, 外部 DTD
内部DTD
a)语法如下:
<!DOCTYPE 根元素 [元素声明]>
b) 元素声明语法:
<!ELEMENT 元素名 (子元素[, 子元素...])>
#PCDATA: (解析字符数据(PCDATA)是XML解析器解析的文本数据使用的一个术语。)
是说该标签内部不能再写标记,应该写普通文本
c) 数量词
+: 表示出现 1 次或多次, 至少一次
?: 表示出现 0 次或 1 次
*: 表示出现任意次
d) 属性声明语法:
<!ATTLIST 元素名称 属性名称 属性类型 默认值>
属性类型: CDATA, 表示字符数据(character data)
默认值:
#REQUIRED, 表示必须出现
#IMPLIED, 表示不是必须的
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE scores [
<!ELEMENT scores (student+)>
<!ELEMENT student (name,course,score)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>
<!ATTLIST student id CDATA #REQUIRED>
]>
<scores>
<student id="1">
<name>刘备</name>
<course>《三分天下》</course>
<score>66</score>
</student>
<student id="2">
<name>曹操</name>
<course>《枭雄》</course>
<score>90</score>
</student>
</scores>
外部DTD
a) 创建一个独立的 dtd 文件
<?xml version="1.0" encoding="UTF-8"?>
<!ELEMENT scores (student+)>
<!ELEMENT student (name,course,score)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT course (#PCDATA)>
<!ELEMENT score (#PCDATA)>
<!ATTLIST student id CDATA #REQUIRED>
b) 在 xml 中引入外部 DTD 文件
<!DOCTYPE root-element SYSTEM "filename">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE scores SYSTEM "scores.dtd">
<scores>
<student id="1">
<name>刘备</name>
<course>《三分天下》</course>
<score>66</score>
</student>
<student id="2">
<name>曹操</name>
<course>《枭雄》</course>
<score>90</score>
</student>
</scores>
Schema
XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 可描述 XML 文档的结构。
XML Schema 语言也可作为 XSD(XML Schema Definition)来引用。
优点: 比dtd 更能更加强大。 提供了更加丰富的数据类型。
XML Schema 可针对未来的需求进行扩展
XML Schema 更完善,功能更强大
XML Schema 基于 XML 编写 (schema本质上就是一个 xml文件)
XML Schema 支持数据类型 (提供的更加丰富的数据类型)
XML Schema 支持命名空间
编写schema约束文件
schema约束文件的后缀名是.xsd,文件内只能有一个根节点,就是schema。
<?xml version="1.0" encoding="UTF-8"?>
<!--
* 引入W3C的名称
* 在根节点上,使用属性xmlns(xml namespace)
* xmlns="http://www.w3.org/2001/XMLSchema"
* 起名:targetNamespace 目标名称空间(起名)
值是任意的:http://www.example.org/person
* elementFormDefault :
* qualified(使用) :质量好的
* unqualified :质量不好的
* 定义元素
* <element name="xx"></element>
* 此处定义的name就是以后xml中的根标签名字
* 判断是否是复杂还是简单的元素
* 如果是简单 在element有属性 type="数据的类型"
* 如果是复杂
* 声明标签是复杂的元素 <complexType>
* 子元素之间的关系
<sequence> 表明元素必须按照顺序出现。
<all> 元素的顺序可以任意。 但是元素出现的次数有且仅有一次。
<choice> 简单元素只能出现其中的一个,但是次数可以不限
* 编写属性 (是要放在xml根标签中的属性)
* <attribute name="xx" type="string" use="required" ></attribute>
* name 属性名称
* type 属性类型
* use 属性约束,值
required 属性必须:
optional 可选择
prohibited 禁止的: 属性不能出现
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/person"
elementFormDefault="qualified">
<element name="person">
<complexType>
<!-- <sequence> -->
<!-- <all> -->
<sequence>
<!-- 简单元素: -->
<element name="name" type="string"></element>
<element name="sex" type="string"></element>
<element name="age" type="int"></element>
<element name="address" type="string"></element>
</sequence>
<!-- </all> -->
<!-- </sequence> -->
<!-- 加入属性约束 -->
<attribute name="id" type="int" use="required"></attribute>
<attribute name="code" type="string" use="optional"></attribute>
</complexType>
</element>
<!-- 下面可以定义多个<element>
name不重复即可
但是在xml中使用时,只能有一个根标签,即要么使用<person>,要么使用<student>
-->
<!--<element name="student"></element>-->
</schema>
使用schema约束文件
<?xml version="1.0" encoding="UTF-8"?>
<person
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.example.org/person"
xsi:schemaLocation="http://www.example.org/person person.xsd"
id="21"
code="sfas">
<!--
xsd文件中设置了<sequence>的话,下面的组件必须按照xsd中的顺序出现,且都出现
xsd文件中设置了<all>的话,下面组件必须全部出现,但每个组件只能出现一次
xsd文件中设置了<choice>的话,下面的组件只能出现一个,次数任意
-->
<name>张三</name>
<sex>男</sex>
<age>1</age>
<address>郑州市</address>
</person>
XML解析
对 xml 文件进行操作, 包括创建 xml, 对 xml 文件进行增删改查操作.
常见的 xml 解析技术
DOM 解析 : 是官方提供的解析方式, 基于 xml 树解析的
SAX 解析 : 是民间的解析方式, 基于事件的解析
JDOM 解析 : 第三方提供, 开源免费的解析方式, 比 DOM 解析快
DOM4J解析 : 第三方提供, 开源免费, 是 JDOM 的升级版
DOM4J解析XML
需要导入 dom4j 的 jar 包, 解析 xml 的入口, 是需要先拿到一个 Document 对象
获得XML中数据
package com.zhiyou.xml;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.util.Iterator;
/**
* @author QiuShiju
* @desc
*/
public class TestReadXML {
public static void main(String[] args) throws DocumentException {
// [1] 创建SAXReader对象, 用于读取xml文件
SAXReader reader = new SAXReader();
// [2] 读取xml文件, 得到Document对象
Document doc = reader.read(new File("src/com/zhiyou/xml/scores2.xml"));
// [3] 获取根元素
Element root = doc.getRootElement();
// [4] 获取根元素下所有子元素
Iterator<?> it = root.elementIterator();
while(it.hasNext()) {
// 取出元素
Element e = (Element) it.next();
System.out.println(e.getName());
// 获取id属性
Attribute id = e.attribute("id");
System.out.println(id.getName() + "=" + id.getValue());
// 获取student的子元素
Iterator<Element> iterator = e.elementIterator( );
while (iterator.hasNext()){
Element el = iterator.next( );
System.out.println(el.getName()+ "=" + el.getStringValue());
}
//Element name = e.element("name");
//Element course = e.element("course");
//Element score = e.element("score");
// 打印
//System.out.println(name.getName()+ "=" + name.getStringValue());
//System.out.println(course.getName() + "=" + course.getText());
//System.out.println(score.getName() + "=" + score.getText());
//System.out.println("--------------------------------------");
}
}
}
创建XML文件
package com.zhiyou.xml;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.File;
import java.io.FileWriter;
/**
* @author QiuShiju
* @desc
*/
public class TestCreatXML {
public static void main(String[] args) throws Exception {
// [1] 通过DocumentHelper生成一个Document对象
Document doc = DocumentHelper.createDocument();
// [2] 添加并得到根元素
Element root = doc.addElement("books");
// [3] 为根元素添加子元素
Element book = root.addElement("book");
// [4] 为book元素添加属性
book.addAttribute("id", "b01");
// [5] 为book添加子元素
Element name = book.addElement("name");
Element author = book.addElement("author");
Element price = book.addElement("price");
// [6] 为子元素添加文本
name.addText("Thinking in Java");
author.addText("小伟");
price.addText("88");
FileWriter fileWriter = new FileWriter(new File("src/book2.xml"));
// [7.1] 输出:都在一行,格式不好
// doc.write(fileWriter);
// [7] 格式良好的输出
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = new XMLWriter(fileWriter, format);
writer.write(doc);
// [8] 关闭资源
writer.close();
}
}