03. XML


一、XML概述

??xml 是可扩展的标记性语言。它可用来保存数据,而且这些数据具有自我描述性。它还可以做为项目或者模块的配置文件。它还可以做为网络传输数据的格式(现在JSON为主)。

二、XML语法

  • 文档声明
    • <?xml version="1.0" encoding="UTF-8"?> xml声明。
      • version是版本的意思,encoding是编码
  • xml注释
  • 元素(标签)
    • XML元素必须遵循以下命名规则
      • 名称可以含字母、数字以及其他的字符
      • 名称不能以数字或者标点符号开始
      • 名称不能包含空格
      • 名称不建议以字符“xml”(或者XML、Xml)开始
    • xml中的元素(标签)也分成单标签双标签
      • 单标签格式:<标签名 属性=”值” 属性=”值” ...... />
      • 双标签格式:<标签名 属性=”值” 属性=”值” ......>文本数据或子标签
  • xml属性
    • xml的标签属性可以提供元素的额外信息,一个标签上可以书写多个属性。每个属性的值必须使用引号引起来。
  • 语法规则
    • 所有XML元素都须有关闭标签(也就是闭合)
    • XML标签对大小写敏感
    • XML必须正确地嵌套
    • XML文档必须有根元素
      • 根元素就是顶级元素,没有父标签的元素,叫顶级元素。
      • 根元素是没有父标签的顶级元素,而且是唯一一个才行。
    • XML的属性值须加引号
  • 文本区域(CDATA区)
    • CDATA语法可以告诉xml解析器,CDATA里的文本内容,只是纯文本,不需要xml语法解析
    • CDATA 格式:
<?xml version="1.0" encoding="utf-8" ?>



    
        时间简史
        霍金
        45
    
    
        果壳中的宇宙
        霍金
        42
    

三、XML的解析技术

??xml是可扩展的标记语言。 不管是html文件还是xml文件它们都是标记型文档,都可以使用w3c组织制定的dom技术来解析。

3.1、dom4j解析技术

3.3.1、dom4j编程步骤

  1. 先加载xml文件创建Document对象
  2. 通过Document对象拿到根元素对象
  3. 通过根元素.elelemts(标签名); 可以返回一个集合,这个集合里放着。所有你指定的标签名的元素对象
  4. 找到你想要修改、删除的子元素,进行相应在的操作
  5. 保存到硬盘上

??创建一个library目录,并添加dom4j的jar包,并添加到类路径。book.xml的文件内容同上

package star.light;

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 test(){
        //1、创建一个SAXReader输入流,去读取xml配置文件,生成Document对象
        SAXReader saxReader = new SAXReader();
        Document document = null;

        try {
            document = saxReader.read("src/books.xml");
            //2、通过Document对象获取根元素
            Element rootElement = document.getRootElement();

            //3、通过根元素获取book标签对象
            //element()和elements()都是通过标签名查找子元素
            List books = rootElement.elements("book");

            //4、遍历,处理每个book标签转换为Book类
            for (Element book:books){
                Element nameElement = book.element("name");
                //getText()可以获取标签中的文本内容
                String nameText = nameElement.getText();

                //直接获取指定标签名的文本内容
                String priceText = book.elementText("price");
                String authorText = book.elementText("author");

                String isbnValue = book.attributeValue("isbn");

                System.out.println(new Book(isbnValue,nameText,new BigDecimal(priceText),authorText));
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}
package star.light;

import java.math.BigDecimal;

public class Book {
    private String isbn;
    private String name;
    private BigDecimal price;
    private String author;

    public Book() {
    }

    public Book(String isbn, String name, BigDecimal price, String author) {
        this.isbn = isbn;
        this.name = name;
        this.price = price;
        this.author = author;
    }

    public String getIsbn() {
        return isbn;
    }

    public void setIsbn(String isbn) {
        this.isbn = isbn;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    public String toString() {
        return "Book{" +
                "isbn='" + isbn + '\'' +
                ", name='" + name + '\'' +
                ", price=" + price +
                ", author='" + author + '\'' +
                '}';
    }
}