一.XML简介
- 什么是XML?
xml是可扩展的标记性语言。 - xml的作用?
xml的主要作用有:
a. 用来保存数据,而且这些数据具有自我描述性。
b. 它还可以做为项目或者模块的配置文件。
c. 还可以做为网络传输数据的格式(现在JSON为主)。
二.xml语法
- 文档声明
- 元素(标签)
- xml属性
- xml注释
- 文本区域(CDATA区)
2.1.文档声明
我们先创建一个简单的XML文件,用来描述图书信息
1)、创建一个xml文件
文件名:
xml声明version是版本的意思encoding是编码,
而且这个<?xml要连在一起写,否则会有报错。
属性:
version 是版本号
encoding 是xml的文件编码
standalone=“yes/no” 表示这个xml文件是否是独立的xml文件
2)、图书有id属性表示唯一标识,书名,有作者,价格的信息。
<?xml version="1.0" encoding="UTF-8" ?>
<!--以上文件就是xml文件的声明
version="1.0" version表示xml的版本
encoding="utf-8" encoding表示xml文本自身的编码-->
<books>
<book sn="SN123456789"><!--book表示一个图书信息 sn属性表示图书序列号-->
<name>时间简史</name><!--name标签表示书名-->
<author>霍金</author><!--author表示作者-->
<price>74</price><!--price表示图书价格-->
</book>
<book sn="SN123456781"><!--book表示一个图书信息 sn属性表示图书序列号-->
<name>时间</name><!--name标签表示书名-->
<author>霍金02</author><!--author表示作者-->
<price>7489</price><!--price表示图书价格-->
</book>
</books>
2.2.xml注释
html和XML注释一样: < !- -html注释- ->
2.3.元素(标签)
html标签:
格式:<标签名>封装的数据</标签名>。
单标签:<标签名/>。
<br/ >换行。
<hr/ >水平线双标签<标签名>封装的数据</标签名>。
标签名大小写不敏感。
标签有属性,有基本属性和事件属性。
标签要闭合(不闭合,html中不报错。但我们要养成良好的书写习惯。闭合)。
1)什么是xml元素
元素是指从开始标签到结束标签的内容。
例如:< title >java编程思想< / title>
元素 我们可以简单的理解为是标签。
Element 翻译 元素
2)XML命名规则
XML元素必须遵循以下命名规则:
2.1)名称可以含字母、数字以及其他的字符
例如:
<book sn="SN123456789"><!--book表示一个图书信息 sn属性表示图书序列号-->
<name>时间简史</name><!--name标签表示书名-->
<author>霍金</author><!--author表示作者-->
<price>74</price><!--price表示图书价格-->
</book>
2.2)、名称不能以数字或者标点符号开始
2.3)、名称不能包含空格
3)、xml中的元素(标签)也分成单标签和双标签:
单标签
格式:<标签名属性=”值”属性=”值”…/>
双标签
格式:<标签名属性=”值”属性=”值”…>文本数据或子标签</标签名>
2.4.xml属性
xml的标签属性和html的标签属性是非常类似的,属性可以提供元素的额外信息
在标签上可以书写属性:
一个标签上可以书写多个属性。每个属性的值必须使用引号引起来。
规则和标签的书写规则一致。
- 属性必须使用引号引起来,不引会报错示例代码
2.5.语法规则:
2.5.1.所有XML元素都须有关闭标签(也就是闭合)
2.5.2.XML标签对大小写敏感
2.5.3.XML必须正确地嵌套
2.5.4.XML文档必须有根元素
根元素就是顶级元素,
没有父标签的元素,叫顶级元素。
根元素是没有父标签的顶级元素,而且是唯一一个才行。
2.5.5.XML的属性值须加引号
2.5.6.XML中的特殊字符
2.5.7.文本区域(CDATA区)
CDATA语法可以告诉xml解析器,我CDATA里的文本内容,只是纯文本,不需要xml语法解析CDATA格式:
<![CDATA[这里可以把你输入的字符原样显示,不会解析xml]]>三.xml解析技术介绍
xml可扩展的标记语言。
不管是html文件还是xml文件它们都是标记型文档,都可以使用w3c组织制定的dom技术来解析。
document对象表示的是整个文档(可以是html文档,也可以是xml文档)。
早期JDK为我们提供了两种xml解析技术DOM和Sax简介(已经过时,但我们需要知道这两种技术)
- dom解析技术是W3C组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。
- Java对dom技术解析标记也做了实现。sun公司在JDK5版本对dom解析技术进行级:SAX(SimpleAPIforXML)SAX解析,它跟W3C制定的解析不太一样。它是以类似事件机制通过回调告诉用户当前正在解析的内容。它是一行一行的读取xml文件进行解析的。不会创建大量的dom对象。所以它在解析xml的时候,在内存的使用上。和性能上。都优于Dom解析。
- 第三方的解析:
a. jdom在dom基础上进行了封装。
b. dom4j又对jdom进行了封装。
c. pull主要用在Android手机开发,是在跟sax非常类似都是事件机制解析xml文件。
d. 这个Dom4j它是第三方的解析技术。我们需要使用第三方给我们提供好的类库才可以解析xml文件。
3.1、Dom4j类库的使用
解压后:
3.2.dom4j目录的介绍:
- docs是文档目录
2) 如何查Dom4j的文档
3) Dom4j快速入门
4) lib目录
5) src目录是第三方类库的源码目录:
3.3.dom4j编程步骤:
第一步:先加载xml文件创建Document对象。
第二步:通过Document对象拿到根元素对象。
第三步:通过根元素.elelemts(标签名);可以返回一个集合,这个集合里放着。所有你指定的标签名的元素对象。
第四步:找到你想要修改、删除的子元素,进行相应在的操作。
第五步,保存到硬盘上。
3.4.获取document对象
- 创建一个lib目录,并添加dom4j的jar包。并添加到类路径。
需要解析的books.xml文件内容:
<?xml version="1.0" encoding="UTF-8" ?>
<!--以上文件就是xml文件的声明
version="1.0" version表示xml的版本
encoding="utf-8" encoding表示xml文本自身的编码-->
<books>
<book sn="SN123456789"><!--book表示一个图书信息 sn属性表示图书序列号-->
<name>时间简史</name><!--name标签表示书名-->
<author>霍金</author><!--author表示作者-->
<price>74</price><!--price表示图书价格-->
</book>
<book sn="SN123456781"><!--book表示一个图书信息 sn属性表示图书序列号-->
<name>时间</name><!--name标签表示书名-->
<author>霍金02</author><!--author表示作者-->
<price>7489</price><!--price表示图书价格-->
</book>
<book sn="SN123456" name="zyy"/><!--单标签模式-->
</books>
解析获取Document对象的代码
第一步,先创建SaxReader对象。这个对象,用于读取xml文件,并创建Document:
@Test
public void test1() {
//1.创建一个saxReader输入流,去读取xml配置文件,生成Document对象
SAXReader saxReader = new SAXReader();
//2.这个对象用于读取xml文件,然后返回一个Document
Document document = null;
try {
document = saxReader.read("src/books.xml");
} catch (DocumentException e) {
e.printStackTrace();
}
//3.打印到控制台,看看是否创建成功。
System.out.println(document);
}
出现如图所示,即成功:
3.5.遍历标签获取所有标签中的内容
需要分四步操作:
第一步,通过创建SAXReader对象。来读取xml文件,获取Document对象。
第二步,通过Document对象。拿到XML的根元素对象。
第三步,通过根元素对象。获取所有的book标签对象。
第四步,遍历每个book标签对象。然后获取到book标签对象内的每一个元素,再通过getText()方法拿到起始标签和结束标签之间的文本内容。
代码如下:
/**
* 读取books.xml生成book类
*/
@Test
public void test2(){
//1.读取books.xml文件
SAXReader reader = new SAXReader();
//在Junit测试中,相对路径是从模块名开始算
Document document = null;
try {
document = reader.read("src/books.xml");
} catch (DocumentException e) {
e.printStackTrace();
}
//2.通过Document对象获取根元素
Element rootElement = document.getRootElement();
//System.out.println(rootElement);
//3.通过根元素获取book标签对象
//element()和elements()都是通过标签名查找子元素
List<Element> books = rootElement.elements("book");
//4.遍历,处理每个book标签转换为book类
for (Element book :books){
Element price = book.element("price");
Element name = book.element("name");
Element author = book.element("author");
System.out.println("书名"+name.getText()+",价格:"+price.getText()+",作者:"+author.getText());
}
}
运行结果: