XML
XML是可扩展的标记性语言。
xml的作用
- 保存数据,而且这些数据具有自我描述性
- 作为项目或者模块的配置文件
- 作为网络传输数据的格式(现在json为主)
<?xml version="1.0" encoding="utf-8" ?>
<!--
以上是 xml 文件的文档声明
version="1.0" 表示 xml 文件的版本
encoding="utf-8" 表示 xml 文件自身的编码
-->
<books>
<book sn="SN123456789">
<name>Java从入门到放弃</name>
<price>9.9</price>
</book>
<book sn="SN987654321">
<name>数据库从删库到跑路</name>
<price>99</price>
</book>
<book sn="SN147258369">
<name>时间简史</name>
<price>999</price>
</book>
</books>
xml语法
- 文档声明
- 元素(标签)
- xml 属性
- xml 注释
- 文本区域(CDATA 区)
文档声明
<?xml version="1.0" encoding="UTF-8"?>
<!--
xml声明
属性
version 版本号
encoding xml的文件编码
standalone="yes/no" 表示这个xml文件是否是独立的xml文件
-->
<root>
<!-- 必须有一个根标签而且只能有一个 -->
</root>
CDATA区
DATA 语法可以告诉 xml 解析器,我 CDATA 里的文本内容,只是纯文本,不需要 xml 语法解析
CDATA 格式:
<root>
<![CDATA[ 这里可以把你输入的字符原样显示,不会解析xml ]]>
</root>
xml 解析技术
不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的 dom 技术来解析。
document 对象表示的是整个文档(可以是 html 文档,也可以是 xml 文档)
早期JDK 为我们提供了两种xml 解析技术DOM 和Sax 简介(已经过时,但我们需要知道这两种技术)
dom 解析技术是 W3C 组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。 Java 对 dom 技术解析标记也做了实现。
sun 公司在 JDK5 版本对 dom 解析技术进行升级:SAX( Simple API for XML )
SAX 解析,它跟 W3C 制定的解析不太一样。它是以类似事件机制通过回调告诉用户当前正在解析的内容。它是一行一行的读取 xml 文件进行解析的。不会创建大量的 dom 对象。
所以它在解析 xml 的时候,在内存的使用上。和性能上。都优于 Dom 解析。
第三方的解析:
- jdom 在 dom 基础上进行了封装
- dom4j 又对 jdom 进行了封装
- pull 主要用在 Android 手机开发,是在跟 sax 非常类似都是事件机制解析 xml 文件
dom4j 解析技术
DOM4J是 dom4j.org 出品的一个开源 XML 解析包。DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。
DOM4J 使用起来非常简单。只要你了解基本的 XML-DOM 模型,就能使用。
Dom:把整个文档作为一个对象。
DOM4J 最大的特色是使用大量的接口。
解析 xml 文档
- 建立一个 SAXReader 对象 用于加载 xml 文件
SAXReader new SAXReader();
- 调用 read 方法获取对应的 xml 文档 得到文档对象
Document read(String systemId);
- 调用 getRootElement 方法得到根标签对象
Element getRootElement();
- 调用 element 或 elements 获得对应子标签对象
Element element(String name);
List elements(String name);
- 调用 getText 方法获得标签中的文本内容
String getText();
也可以直接调用 elementText 方法得到子标签中的文本内容
String elementText(String name);
- 调用 attribute 方法得到标签的指定属性对象
Attribute attribute(String name);
- 调用 getValue 获得对应属性的 value 值
String getValue();
也可以直接调用 attributeValue 方法直接获取到指定标签的 value 值
String attributeValue(String name);
SAXReader saxReader = new SAXReader();
// 1. 读取 xml 文件获取整个文档
Document document = saxReader.read("books.xml");
// 2. 通过 document 对象获取到 xml 文件的根元素
Element rootElement = document.getRootElement();
// 3. 通过根元素获取到对应的标签
// Element element() 和 List elements() 都是根据标签名获取子元素对象
List<Element> books = rootElement.elements("book");
// 遍历每个 book 标签子元素
for(Element book : books) {
// String asXML() 将标签元素转换成 xml 字符串
// System.out.println(book.asXML());
// 通过 Element element() 根据标签名获取对应的子元素对象
Element nameElement = book.element("name");
// 4. String getText() 方法获取标签中间的文本内容
String nameText = nameElement.getText();
// 直接通过标签名获取到文本内容
String price = book.elementText("price");
// 5. Attribute attribute(String name) 通过属性名获得标签中的属性对象
// Attribute sn = book.attribute("sn");
// String getValue() 获取此属性对象的值
// String snValue = sn.getValue();
// String attribute(String name) 可直接通过此方法获取到指定属性值
String snValue = book.attributeValue("sn");
// 将每个 book 标签封装成对应的 Java 类对象
System.out.println(new Book(snValue, nameText, Double.parseDouble(price)));
}