一、XML简介

1.xml定义

xml是可扩展的标记性的语言

2.xml的作用

  • 保存数据,且这些数据具有自我描述性
  • 做为项目或者模块的配置文件
  • 作为网络传输的交换格式(现在以json为主)

    二、XML的结构

    xml的组成
    1.文档声明。
    2. 元素(标签)
    3. xml 属性
    4. xml 注释
    5. 文本区域(CDATA 区)

1.文档声明

文档声明格式:<?xml version=”1.0” encoding=”UTF-8”?>
<?xml 要连在一起写,否则会有报错
属性
version 是版本号
encoding 是xml 的文件编码
standalone=” yes/no” 表示这个 xml 文件是否是独立的 xml 文件

  1. <?xml version="1.0" encoding="UTF-8"?> xml 声明。
  2. <!-- xml 声明 version 是版本的意思 encoding 是编码 -->

2.xml元素

(1)xml元素定义

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。

  1. 元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。
  2. <books>
  3. 文本内容
  4. <book sn="sn001">
  5. <name>活着</name>
  6. </book>
  7. </books>

(2)xml标签的命名规则

XML 元素必须遵循以下命名规则:

  • 名称可以含字母、数字以及其他的字符
  • 名称不能以数字或者标点符号开始
  • ~~名称不能以字符 “xml”(或者 XML、Xml)开始 ~~
  • 名称不能包含空格

可使用任何名称,没有保留的字词。

3.xml语法规则

标签的语法规则:1-3

(1)所有xml元素都必须由闭标签

  1. 单表签
  2. <tagName/>
  3. 双标签
  4. <tagName></tagName>

(2)XML 标签对大小写敏感

  1. 必须使用相同的大小写来编写打开标签和关闭标签:
  2. <Message>这是错误的。</message>
  3. <message>这是正确的。</message>

(3)XML 必须正确的嵌套

  1. 一个xml标签必须完整的嵌套另一个标签,不能交叉
  2. <b><i>错误的交叉嵌套</b></i>
  3. <b><i>正确的完整嵌套</i></b>

(4)XML 文档必须有根元素

  1. XML 文档必须有且唯一元素是所有其他元素的父元素。该元素称为根元素。
  2. <root>
  3. <child>
  4. <subchild>.....</subchild>
  5. </child>
  6. </root>

(5)XML 的属性值须加引号

  1. <books>
  2. <book sn=sn001>属性值未加引号,错误的表达</book>
  3. <book sn="sn002">属性值加引号,正确的表达</book>
  4. </books>

(6)xml标签里的特殊字符

在 XML 中,有 5 个预定义的实体引用:

< < 小于
> > 大于
& & 和号
' 省略号
" 引号
  1. <!--常用的<>号要使用特殊字符代替-->
  2. <book>
  3. <name><大于小于号不能直接使用></name>
  4. <name>&lt;正确的使用&gt;</name>
  5. </book>

(7)CDATA语法

CDATA 语法可以告诉 xml 解析器,我 CDATA 里的文本内容,只是纯文本,不需要 xml 语法解析

  1. <!-- CDATA 格式: -->
  2. <!--<![CDATA[ 这里可以把你输入的字符原样显示,不会解析 xml ]]>-->
  3. <book><![CDATA[这里可以把你输入的字符原样显示,不会解析 xml]]></book>

(8)xml的注释

  1. 注释的语法格式:<!--文本内容-->
  2. <!--文本内容-->

三、xml解析(*重点)

1.xml解析技术介绍

xml 可扩展的标记语言。
不管是 html 文件还是 xml 文件它们都是标记型文档,都可以使用 w3c 组织制定的 dom 技术来解析。
image.png
早期 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 它是第三方的解析技术。我们需要使用第三方给我们提供好的类库才可以解析 xml 文件。

2.dom4j解析技术(*重点)

由于 dom4j 它不是 sun 公司的技术,而属于第三方公司的技术,我们需要使用 dom4j 就需要到 dom4j 官网下载 dom4j
的 jar 包。

(1)dom4j的使用

dom4j解压后的文件
image.png

(2)dom4j的目录介绍

1)dom4j的目录
image.png
2)如何查 Dom4j 的文档
image.png
3)Dom4j 快速入门
image.png
4)lib 目录
image.png
5)src 目录是第三方类库的源码目录:
image.png

(3)dom4j实践

1)步骤
第一步: 先加载 xml 文件创建 Document 对象
第二步:通过 Document 对象拿到根元素对象
第三步:通过根元素.elelemts(标签名); 可以返回一个集合,这个集合里放着。所有你指定的标签名的元素对象
第四步:找到你想要修改、删除的子元素,进行相应在的操作
第五步,保存到硬盘上
2)需要解析的xml文档

  1. <books>
  2. <book sn="0000001">
  3. <name>武林外传</name>
  4. <price>28.8</price>
  5. <author>宁财神</author>
  6. </book>
  7. <book sn="0000002">
  8. <name>天龙八部</name>
  9. <price>28.8</price>
  10. <author>金庸</author>
  11. </book>
  12. </books>

3)解析xml文档(java)

  1. public class BookTest {
  2. @Test
  3. public void xmlTest() throws DocumentException {
  4. //需要分四步操作:
  5. // 第一步,通过创建 SAXReader 对象。来读取 xml 文件,获取 Document 对象
  6. // 第二步,通过 Document 对象。拿到 XML 的根元素对象
  7. // 第三步,通过根元素对象。获取所有的 book 标签对象
  8. // 第四步,遍历每个 book 标签对象。然后获取到 book 标签对象内的每一个元素,再通过 getText() 方法拿到起始标签和结束标签之间的文本内容
  9. // 第一步,通过创建 SAXReader 对象。来读取 xml 文件,获取 Document 对象
  10. SAXReader saxReader = new SAXReader();
  11. Document document = saxReader.read("src/book.xml");
  12. // 第二步,通过 Document 对象。拿到 XML 的根元素对象
  13. Element root = document.getRootElement();
  14. // 第三步,通过根元素对象。获取所有的 book 标签对象
  15. List<Element> books = root.elements("book");
  16. // 第四步,遍历每个 book 标签对象。然后获取到 book 标签对象内的每一个元素,再通过 getText() 方法拿到起始标签和结束标签之间的文本内容
  17. for (Element book:books){
  18. Element name = book.element("name");
  19. Element price = book.element("price");
  20. Element author = book.element("author");
  21. Attribute sn = book.attribute("sn");
  22. String nameText = name.getText();
  23. String priceText = price.getText();
  24. String authorText = author.getText();
  25. String snText = sn.getText();
  26. System.out.println(new Book(nameText,Double.parseDouble(priceText),authorText,snText));
  27. }
  28. }
  29. }

结果

  1. Book{name='武林外传', price=28.8, author='宁财神', sn='0000001'}
  2. Book{name='天龙八部', price=28.8, author='金庸', sn='0000002'}