一、XML简介
XML是可扩展(可自定义标签)的标记性语言
1、XML作用:
1、用来保存数据,而且这些数据具有自我描述性
2、还可以作为项目或者模块的配置文件
3、还可以作为网络传输数据的格式,现在以json为主
2、XML语法
1、xml声明
<?xml version="1.0" encoding="utf-8" ?>
<books> <!--books表示多个图书信息-->
<book sn="SN123455"> <!--book表示一个图书信息 sn属性表示图书序列号-->
<name>时间简史</name> <!--书名-->
<author>霍金</author> <!--作者-->
<price>75.00</price> <!--价格-->
</book>
<book sn="SN123456"> <!--book表示一个图书信息 sn属性表示图书序列号-->
<name>Java教程</name> <!--书名-->
<author>小明</author> <!--作者-->
<price>35.00</price> <!--价格-->
</book>
</books>
2、xml语法介绍
(1)标签命名可以包含字母、数字和其他字符
(2)必须有根标签,且只能有一个
(3)CDATA区 文本区域:里面的内容只是纯文本,不需要XML语法解析
<![CDATA[这里把你输入的字符原样显示,不会解析xml]]>
3、xml解析技术
html和xml都可以用w3c组织制定的dom技术来解析
早期jdk提供了两种xml解析技术dom和sax
sax解析(simple API for XML),他跟w3c制定的解析不太一样,他是以类似事件机制通过回调告诉用户当前正在解析的内容,他是一行一行的读取xml文件进行解析,不会创建大量dom对象
因此sax在解析xml时,在内存的使用上和性能上,都优于dom解析。
jdom在dom基础上进行了封装
dom4j又对jdom进行了封装
pull主要用在Android手机开发,是和sax非常类似的事件机制解析xml文件
【dom4j是第三方解析稀释,需要使用第三方的类库才可以解析xml】
4、dom4j解析技术
module下新建目录,复制dom4j的jar包进来,加入到类路径下
(1)Books.java
import java.math.BigDecimal;
public class Book {
private String sn;
private String name;
private String author;
private BigDecimal price;
public Book() {
}
public Book(String sn, String name, String author, BigDecimal price) {
this.sn = sn;
this.name = name;
this.author = author;
this.price = price;
}
@Override
public String toString() {
return "Book{" +
"sn='" + sn + '\'' +
", name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
}
(2)Dom4jTest.java
[用Junit,Dom4j 把books.xml文档中的book标签转换为Books类对象]
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.math.BigDecimal;
import java.util.List;
public class Dom4jTest {
@Test
public void test1() {
//创建一个SaxReader输入流,去读取xml配置文件,生成document对象
SAXReader saxReader = new SAXReader();
Document document = null;
try {
document = saxReader.read("src/books.xml");
} catch (DocumentException e) {
e.printStackTrace();
}
System.out.println(document);
}
/*
* 读取books.xml文件生成Book类*/
@Test
public void Test2() throws DocumentException {
//1 读取book.xml文件
SAXReader reader = new SAXReader();
//2 通过document对象获取根元素
//在junit测试中相对路径是从模块名开始算,即xml1
Document document = reader.read("src/books.xml");
Element rootElement = document.getRootElement();
//3 通过根元素获取每一个book标签对象
List<Element> books = rootElement.elements("book");
//4 遍历,处理每个book标签转换为book类
for(Element book: books){
//System.out.println(book.asXML());
//asXMl()方法把标签对象,转换为标签字符串
Element nameElement = book.element("name");
//System.out.println(nameElement.asXML());
String nameText = nameElement.getText();
//getText()获取标签中的文本内容
//System.out.println(nameText);
String priceText = book.elementText("price");
String authorText = book.elementText("author");
//直接获取指定标签名的文本内容
//System.out.println(priceText);
String sn = book.attributeValue("sn");
//获取指定标签的属性值
//System.out.println(sn);
Book newbook = new Book(sn, nameText, authorText, new BigDecimal(priceText));
System.out.println(newbook);
}
}
}
输出结果:
Book{sn='SN123455', name='时间简史', author='霍金', price=75.00}
Book{sn='SN123456', name='Java教程', author='小明', price=35.00}