1. XML 简介
什么是 xml?
xml 是可扩展的标记性语言。
xml 的作用?
xml 的主要作用有:
1、用来保存数据,而且这些数据具有自我描述性
2、它还可以做为项目或者模块的配置文件
3、还可以做为网络传输数据的格式(现在 JSON 为主)。
2. xml 语法
1. 文档声明。
2. 元素(标签)
3. xml 属性
4. xml 注释
5. 文本区域(CDATA 区
2.1 文档声明
我们先创建一个简单 XML 文件,用来描述图书信息。
2)文件名后缀为.xml
3) 编写xml文档内容
<?xml version="1.0" encoding="UTF-8"?> xml声明。
<! -- xml声明version是版本的意思encoding是编码-->而且这个<?xml要连在一起写,否则会有报错
属性
version是版本号
encoding是xml的文件编码
standalone="yes/no"表示这个xml文件是否是独立的xml文件
这里编写图书信息文档,图书有 id 属性 表示唯一 标识,书名,有作者,价格的信息
<?xml version="1.0" encoding="UTF-8" ?>
<!--这是xml注释-->
<books>
<book id="SN12345678901"><!-- book标签描述一本图书 id属性描述的是图书的编号 -->
<name>java编程思想</name><!-- name标签表述的是图书的名称 -->
<author>张三</author><!-- author描述的是作者的意思,表述图书作者 -->
<price>9.9</price><!-- price描述的是价格,描述的是图书的价格 -->
</book>
<book id="SN12345678902"><!-- book标签描述一本图书 id属性描述的是图书的编号 -->
<name>java从入门到入土</name><!-- name标签表述的是图书的名称 -->
<author>李四</author><!-- author描述的是作者的意思,表述图书作者 -->
<price>99</price><!-- price描述的是价格,描述的是图书的价格 -->
</book>
<book id="SN12345678903" name="放弃java" author="王五" price="999"/>
</books>
在浏览器中可以查看到文档
2.2 xml 注释
html 和 XML 注释 一样 都为:<!-- -->
2.3 元素(标签)
先回忆一下:
html标签:
格式:<标签名>封装的数据</标签名>
单标签: <标签名/><br />换行<hr/>水平线双标签<标签名>封装的数据</标签名>
标签名大小写不敏感
标签有属性,有基本属性和事件属性
标签要闭合(不闭合﹐html中不报错。但我们要养成良好的书写习惯。闭合)
2.3.1 什么是xml元素
元素是指从开始标签到结束标签的内容。例如:<title>java编程思想</title>
元素我们可以简单的理解为是标签。Element翻译元素
2.3.2 XML元素命名规则
XML 元素必须遵循以下命名规则:
名称可以含字母、数字以及其他的字符(包括中文)
名称不能以数字或者标点符号开始
名称不能包含空格 (否则空格后面的会被当成属性,必须添加属性值)
2.3.3 xml 中的元素(标签)也 分成 单标签和双标签
单标签
格式:<标签名属性=”值”属性="值”......./>
双标签
格式:<标签名属性=值”属性=”值”....…>文本数据或子标签</标签名>
如:
2.4 xml属性
xml的标签属性和 html的标签属性是非常类似的,属性可以提供元素的额外信息
在标签上可以书写属性:
一个标签上可以书写多个属性。每个属性的值必须使用引号引起来。xml属性的规则和标签的书写规则一致。
2.5 语法规则
所有 XML 元素都须有关闭标签(也就是闭合
XML 标签对大小写敏感(开始标签与结束标签的大小写要一致)
XML 必须正确地嵌
XML 文档必须有根元素(且唯一)
根元素就是顶级元素, 没有父标签的元素,叫顶级元素。
根元素是没有父标签的顶级元素,而且是唯一一个才行。
XML 的属性值须加引号
XML 中的特殊字符标签与html一致
如:空格 为 < 为 < > 为 >
文本区域(CDATA 区)
CDATA 语法可以告诉 xml 解析器,我 CDATA 里的文本内容,只是纯文本,
不需要 xml 语法解析 CDATA 格式:
<![CDATA[这里可以把你输入的字符原样显示,不会解析xml ]]>
代码示例:
<!--这是xml注释--> <books> <![CDATA[<<< 这里是CDATA区 >>>]]]> </books>
3. xml 解析技术介绍
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它是第三方的解析技术。我们需要使用第三方给我们提供好的类库才可以解析xml文件。
4. dom4j 解析技术
由于 dom4j 它不是 sun 公司的技术,而属于第三方公司的技术,我们需要使用 dom4j 就需要到 dom4j 官网下载 dom4j 的 jar 包
4.1 dom4j 编程步骤
第一步: 先加载 xml 文件创建 Document 对象
第二步:通过 Document 对象拿到根元素对象
第三步:通过根元素.elelemts(标签名); 可以返回一个集合,这个集合里放着。所有你指定的标签名的元素对象
第四步:找到你想要修改、删除的子元素,进行相应在的操作 第五步,保存到硬盘上
4.2 获取 document 对象
1.创建一个 lib 目录,并添加 dom4j 的 jar 包。并添加到类
2. 需要解析的 books.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--这是xml注释-->
<books>
<book id="SN12345678901"><!-- book标签描述一本图书 id属性描述的是图书的编号 -->
<name>java编程思想</name><!-- name标签表述的是图书的名称 -->
<author>张三</author><!-- author描述的是作者的意思,表述图书作者 -->
<price>9.9</price><!-- price描述的是价格,描述的是图书的价格 -->
</book>
<book id="SN12345678902"><!-- book标签描述一本图书 id属性描述的是图书的编号 -->
<name>java从入门到入土</name><!-- name标签表述的是图书的名称 -->
<author>李四</author><!-- author描述的是作者的意思,表述图书作者 -->
<price>99</price><!-- price描述的是价格,描述的是图书的价格 -->
</book>
</books>
3.先创建 SaxReader 对象。这个对象,用于读取 xml 文件,并创建 Document
public void getDocument() throws DocumentException {
// 要创建一个 Document 对象,需要我们先创建一个 SAXReaDer
SAXReader reader = new SAXReader();
//这个对象用于读取 xml 文件,然后返回一个 Document对象
Document document = reader.read("src/books.xml");
// 打印到控制台,看看是否创建成
System.out.println(document);
}
4.3 遍历 标签 获取所有标签中的内容
获取所有标签中的内容需要分四步操作:
第一步,通过创建SAXReader对象。再用该对象使用read方法来读取xml文件,获取 Document对象
第二步,通过Document对象。使用getRootElement方法拿到xML的根元素对象
第三步,通过根元素对象。使用elements方法获取所有的book标签对象
第四步,使用element方法遍历每个 book标签对象。然后获取到 book标签对象内的每一个元素,使用attributeValue()方法根据参数名获取标签属性值的对象,再通过getText()方法拿到起始标签和结束标签之间的文本内容
public void readXML() throws DocumentException {
//第一步,通过创建SAXReader对象。再用该对象使用read方法来读取xml文件,获取 Document对象
SAXReader reader = new SAXReader();
Document document = reader.read("src/books.xml");
//第二步,通过Document对象。使用getRootElement方法拿到xML的根元素对象
Element rootElement = document.getRootElement();
// 打印测试
// Element.asXML(); 它将当前元素转换成为 String 对象
//System.out.println(rootElement.asXML());
//第三步,通过根元素对象。使用elements方法获取所有的book标签对象
List<Element> books = rootElement.elements("book");
//第四步,使用element方法遍历每个 book标签对象。然后获取到 book标签对象内的每一个元素,
// 使用attributeValue()方法根据参数名获取标签属性值的对象
// 再通过getText()方法拿到起始标签和结束标签之间的文本内容
for (Element book : books) {
Element name = book.element("name");
Element author = book.element("author");
Element price = book.element("price");
String id = book.attributeValue("id");
System.out.println("id:" + id + "\t书名:" + name.getText() +
"\t作者:" + author.getText() + "\t价格:" + price.getText());
}
结果: