目录
xml概述
xml语法
xml解析技术介绍
Dom4j库的使用
演示
xml概述
是什么?
xml是可扩展的标记性语言
作用?
1、用来保存数据,而且这些数据具有自我描述性
2、它还可以作为项目或者模块的配置文件
3、还可以作为网络传输数据的格式(用的不多了,现在以json为主)
例如
xml语法
1、文档声明
2、元素(标签)
3、xml属性
4、xml注释
5、文本区域(CDATA区)
例子:
创建xml文件:file.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--
以上内容就是xml文件的声明
version=1.0版本
encoding表示xml的编码
-->
<books><!--books表示多个图书信息-->
<book sn="SN3112313"><!--book表示一个图书信息 sn属性表示图书序列号-->
<name>时间简史</name><!--name标签表示书名-->
<author>霍金</author><!--author表示作者-->
<price>75</price><!--表示图书价格-->
</book>
</books>
语法:
1、xml注释
html和xml的注释一样
2、元素(标签)
什么是xml元素?
xml元素指的是从开始标签直到结束标签的部分
元素可包含其他元素,文本,或两者的混合物,元素也可以拥有属性
3、命名规则
1、名称可以包含字母、数字以及其他的字符,包含中文
2、名称不能以数字或标点符号开始
3、名称不能以字符"xml"(或者XML、Xml)开始(其实可以)
4、名称不能包含空格
可以使用任何名称,没有保留的字词
4、xml中的元素(标签)也分成单标签和双标签
单标签
格式:<标签名 属性="值" 属性="值"……/>
例子<book sn="sn123123" name="一本书" author="一个作者" price="99999"/>
双标签
格式:<标签名 属性="值" 属性="值"……>文本数据或子标签</标签名>
5、xml属性
xml的标签属性和html的标签属性非常相似,属性可以提供元素的额外信息
在标签上可以书写属性:
一个标签上可以书写多个属性。每个属性的值必须使用引号引起来
6、其他语法规则
1、所有的xml元素都必须关闭标签(闭合)
2、xml标签对大小写敏感
3、标签必须正确的嵌套
4、文档必须有根元素
根元素就是顶级元素(没有父标签的元素),而且只有唯一一个,也就是上述例子用的books
5、xml中的特殊字符
<用<表示, >用>表示
7、文本区域(CDATA区)
CDATA语法可以告诉xml解析器,我CDATA里的文本内容,只是纯文本,不需要xml语法解析
CDTATA格式
<![CDATA[这里可以把你输入的字符原样显示,不会机械xml]]>
示例:
<author>
<![CDATA[
<<<<<<<<<<<<<<<
]]>
</author>
xml解析技术介绍
不管是html还是xml都是标记型文档,都可以使用w3c组织制定的dom技术来解析
早期jdk为我们提供了两种xml解析技术DOM和Sax(已过时)
dom解析技术是w3c组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现
java对dom技术解析也做了实现
jdk5对dom解析进行了升级:SAX(simple Api for XML)
SAX解析与w3c制定的解析不太一样,它是类似时间机制通过回溯告诉用户正在解析的内容
它是一行一行的读取,不会创建大量的dom对象,所有在内存使用上和性能上都优于dom解析
第三方解析
jdom 在dom基础上进行了封装
dom4j 又对jdom进行了封装
pull 主要用在Android手机开发,是在跟sax非常类似都是事件机制解析xml文件
Dom4j库的使用
dom4j的jar包以及文档、文件夹等
如何解析?使用上面的books的xml进行演示
创建一个Book类
创建lib文件夹放入jar包并add as library
补充as library时有三个下拉选项
Global是以后的项目也能使用
Project是每个模块都能使用
module是给该模块自己使用
演示
//读取books.xml文件生成book类
@Test
public void test2() throws DocumentException {
//1 读取books.xml文件
SAXReader saxReader = new SAXReader();
//在junit测试中,相对路径名是从模块名开始算的
Document document = saxReader.read("src/books.xml");
//2 通过Document对象获取根元素
Element rootElement = document.getRootElement();
//3、通过根元素获取book标签对象
//element()和elements()都是通过标签名查找子元素,只不过一个返回一个,一个返回多个
List<Element> books = rootElement.elements("book");
//4、遍历,处理每个book标签转换为book类
for (Element book : books) {
//axXML()把标签对象转换成字符串
//System.out.println(book.asXML());//就是将标签原样打印
Element nameElement = book.element("name");
//使用getText获取标签中的文本内容
String nameText = nameElement.getText();
//elementText直接获取指定标签名的文本内容
String priceText = book.elementText("price");
String authorText = book.elementText("author");
//attribute()获取标签属性
String sn = book.attributeValue("sn");
System.out.println(new Book(sn,nameText,Double.parseDouble(priceText),authorText));
}
}