什么是XML
xml是一种可扩展性的标记性语言。
标记性语言类似于html,xml与它很多地方很相似,故可推断xml也是标记性语言。
html中的标签规定好的,xml中的标签是可以自己写的,所以是可扩展性。
XML的作用
- 用于保存数据,数据具有自我描述性。
<?xml version="1.0" encoding="UTF-8"?>
<books> <!-- 该标签为父标签,描述了两本书的信息 -->
<book sn="16000987"> <!-- 该标签为子标签,描述了一本书的信息 -->
<name>java从入门到放弃</name>
<author>郭靖</author><!-- 该标签描述的这本书的作者 -->
<price>2.99</price>
</book>
<book sn="16000988">
<name>少林十八棍法</name>
<author>方丈</author>
<price>9.99</price>
</book>
</books>
- 它可以作为项目或者模块的配置文件。
- 作为网络传输数据的格式(json为主)
XML的语法
- 文档的声明
version=1.0 指的是xml的版本是1.0;
encoding="utf-8"指的是xml的编码方式为UTF-8;
<?xml version="1.0" encoding="UTF-8"?>
- 注释:同html
- 元素:
从标签的开始,到标签的结束,为一个元素 - 属性:
书的属性有 序列号 sn,作者author,价格price,书名name
<book sn="16000987"> <!-- 该标签为子标签,描述了一本书的信息 -->
<name>java从入门到放弃</name>
<author>郭靖</author><!-- 该标签描述的这本书的作者 -->
<price>2.99</price>
</book>
XML语法的规则
-
所有xml标签必须闭合
<start> ..... </start>
,不闭合就会报错 -
标签对大小写敏感
-
xml标签必须正确的嵌套
price标签的位置摆错了 -
xml文档必须要用父标签(根标签)
根标签就是没有父标签的标签,且根标签必须唯一,不能重复。 -
属性值必须加上引号
-
XML中的特殊字符
<author><方丈</author>
XML会将文本内容"<"解析为XML语法的一部分,报错。若想在标签文本内容中加入特殊符号,需要特殊字符 <author><方丈></author>
- 文本区域(CDATA区)
在<![CDATA[]]>中的内容,xml解释器会默认为是纯文本,不会对其进行解析。
<author>
<![CDATA[
<<<<<<<<<<<<<<<<<<<郭靖>>>>>>>>>>>>]]>
</author><!-- 该标签描述的这本书的作者 -->
若想要在标签文本内容中带有多个特殊符号,可以用这个方法,会比上一个特殊字符法便捷。
XML解析技术的介绍
解析的含义:
不管是xml还是html,它们都属于标记性文档,标记性文档可以用 w3c制定dom技术进行解析。
document对象封装了整个xml文档(或者html文档)
早期 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 文件。
DOM4j技术
在使用dom4j技术进行解析的时候需要用到一些Element类提供的成员方法:
elments()方法:
element()方法 :区别于elements,可以返回指定的元素
asXML()方法:将元素以字符串形式进行返回
getText()方法:返回元素当中的文本信息
attributeValue()方法:获取元素对应标签的属性值
elementText()方法:获取指定子元素的文本信息,比较方便推荐使用
- 读取XML文件,获取Document对象
创建SAXReader实例,并调用read方法。read方法中的参数是xml文件的相对路径,该相对路径以模块为起点。获得一个封装了xml的Document对象。
//第一步读取xml文件
SAXReader reader=new SAXReader();
//在测试单元中相对路径是从模块开始算的
Document document=reader.read("src/books.xml");
- 获取根元素
将 《books> …</books 封装到element对象当中,并返回
//第二步,获取根元素
Element rootelement=document.getRootElement();
- 通过根元素,获取所有的子元素
Element 类提供的成员方法 elements可以获取所有子元素,并将它们装在List中进行返回
//第三步:element elements()方法获取子元素
List<Element> books=rootelement.elements();
- 对第三步得到的List进行迭代,对当中各个子元素进行操作,获取name,author,price ,sn等信息。
for(Element book :books){
//asXML():将元素以字符串的形式返回
//System.out.println(book.asXML());
//element获取指定子元素
Element bookname=book.element("name");
//getText()直接获取文本信息以字符串返回
String name=bookname.getText();
//elementText获取指定元素文本信息
String author=book.elementText("author");
String price=book.elementText("price");
//获取标签属性
String sn=book.attributeValue("sn");
- 利用得到的book元素的信息(name,author …)作为参数,利用Book类的构造函数创建book对象。
Book book_=new Book(name,author,Double.parseDouble(price),sn);