XML是可扩展(可自定义标签)的标记性语言
1、用来保存数据,而且这些数据具有自我描述性
2、还可以作为项目或者模块的配置文件
3、还可以作为网络传输数据的格式,现在以json为主
- "1.0" encoding="utf-8" ?>
-
- <books>
- <book sn="SN123455">
- <name>时间简史name>
- <author>霍金author>
- <price>75.00price>
- book>
-
- <book sn="SN123456">
- <name>Java教程name>
- <author>小明author>
- <price>35.00price>
- book>
- books>
(1)标签命名可以包含字母、数字和其他字符
(2)必须有根标签,且只能有一个
(3)CDATA区 文本区域:里面的内容只是纯文本,不需要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】
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
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}