Chapter5 XML
5.1 XML 简介
5.1.1 xml是什么
xml 是可扩展的标记性语言
5.1.2 xml 的作用
1. 用来保存数据, 而且这些数据具有自我描述性
2. 它还可以做为项目或者模块的配置文件
3. 还可以做为网络传输数据的格式(现在 JSON 为主)
5.2 xml 语法
5.2.1 文档声明
- 代码
<?xml version="1.0" encoding="UTF-8"?>
- 属性
- version 是版本号
- encoding 是 xml 的文件编码
- standalone=”yes/no” 表示这个 xml 文件是否是独立的 xml 文件
5.2.2 xml注释
- 格式
<!-- xml注释 -->
- xml注释与html相同
5.2.3 元素
- 元素是指从开始标签到结束标签的内容。
- XML 元素命名规则
- 名称可以含字母、 数字以及其他的字符
- 名称不能以数字或者标点符号开始
- 名称不能包含空格
5.2.4 xml属性
- xml属性与html类似
- 属性必须使用引号引起来, 不引会报错示例代码
5.2.5 语法规则
- 所有 XML 元素都须有关闭标签
- XML 中的元素( 标签) 也 分成 单标签和双标签
- XML 标签对大小写敏感
- XML 文档必须有根元素
- 根元素就是顶级元素
- 没有父标签的元素, 叫顶级元素。
- 根元素是唯一一个才行
- XML 的属性值须加引号
- XML 中的特殊字符:与HTML相同(
<
) - 文本区域( CDATA 区)
- CDATA 语法可以告诉 xml 解析器, 我 CDATA 里的文本内容, 只是纯文本, 不需要 xml 语法解析
- CDATA 格式
<![CDATA[ 这里可以把你输入的字符原样显示,不会解析 xml ]]>
5.3 XML 解析
5.3.1 解析技术
- 不管是 html 文件还是 xml 文件它们都是标记型文档, 都可以使用 w3c 组织制定的 dom 技术来解析
- 早期 JDK 为我们提供了两种 xml 解析技术 DOM 和 Sax 简介(已经过时, 但需要知道)
- 第三方的解析:
- jdom 在 dom 基础上进行了封装 、
dom4j
又对 jdom 进行了封装。- pull 主要用在 Android 手机开发, 是在跟 sax 非常类似都是事件机制解析 xml 文件。
5.3.2 dom4j 解析技术
dom4j类库的使用
- dom4j是第三方技术,需要下载相应的jar包
- dom4j是开源的:github
dom4j 编程步骤:
- 先加载 xml 文件创建 Document 对象
- 通过 Document 对象拿到根元素对象
- 通过
根元素.elelemts(标签名);
可以返回一个集合,这个集合里放着所有你指定的标签名的元素对象 - 找到你想要修改、删除的子元素,进行相应在的操作
- 保存到硬盘上
获取 document 对象
- 需要先导入jar包
- books.xml
<?xml version="1.0" encoding="UTF-8"?> <books> <book sn="SN12341232"> <name>辟邪剑谱</name> <price>9.9</price> <author>班主任</author> </book> <book sn="SN12341231"> <name>葵花宝典</name> <price>99.99</price> <author>班长</author> </book> </books>
- Book.class
package com.atguigu.javaweb; import java.math.BigDecimal; public class Book { private String sn; private String name; private BigDecimal price; private String author; public Book(String sn, String name, BigDecimal price, String author) { this.sn = sn; this.name = name; this.price = price; this.author = author; } public Book() { } public String getSn() { return sn; } public void setSn(String sn) { this.sn = sn; } public String getName() { return name; } public void setName(String name) { this.name = name; } public BigDecimal getPrice() { return price; } public void setPrice(BigDecimal price) { this.price = price; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } @Override public String toString() { return "Book{" + "sn='" + sn + '\'' + ", name='" + name + '\'' + ", price=" + price + ", author='" + author + '\'' + '}'; } }
- Dom4jTest.class
package com.atguigu.javaweb; import org.dom4j.*; import org.dom4j.io.SAXReader; import org.junit.Test; import java.math.BigDecimal; import java.util.List; public class Dom4jTest { @Test public void test1() { // 1. 创建一个SaxReader输入流,去读取xml配置文件,生成Document对象 SAXReader saxReader = new SAXReader(); Document document = null; try { document = saxReader.read("src/books.xml"); // Junit测试中,相对路径从模块名开始 } catch (DocumentException e) { e.printStackTrace(); } // 2. 通过Document对象获取根元素 assert document != null; Element rootElement = document.getRootElement(); // 3. 通过根元素获取book标签对象 String s = "book"; List<Element> books = rootElement.elements(s);// element()和elements()可以通过标签名查找子元素 // 4. 遍历,处理每个book标签转换为Book类 for (Element book:books) { Element nameElement = book.element("name"); // System.out.println(nameElement.asXML()); // asXML()把标签对象转换为标签字符串 String nameText = nameElement.getText(); // getText() 可以获取标签中的文本内容 String priceText = book.elementText("price"); // 直接获取文本内容 String authorText = book.elementText("author"); String snValue = book.attributeValue("sn"); System.out.println(new Book(snValue,nameText, BigDecimal.valueOf(Double.parseDouble(priceText)),authorText)); } } }