XML笔记

XML

1、为什么需要XML

(1)需求1:两个进程间进行数据通信

(2)需求2:这一台服务器,做一个配置文件,当服务器程序启动时,去读取它应当监听的端口号、还有连接数据库的用户名和密码

(3)Spring中的ico配置文件,beans.xml mybatis xxxMapper.xml tomcat server.xml web.xml maven pom.xml

(4)能存储复杂的数据关系

2、XML技术用于解决什么问题?

在这里插入图片描述

3、XML快速入门

1、需求:使用idea创建student.xml存储多个学生信息

<?xml version="1.0" encoding="utf-8" ?>
<students>
    <student id="100">
        <name>jack</name>
        <age>20</age>
        <gender></gender>
    </student>
    <student id="200">
        <name>marry</name>
        <age>18</age>
        <gender></gender>
    </student>
</students>

4、XML语法

(1)一个XML文件分为如下几部分内容

  1. 文档说明
  2. 元素
  3. 属性
  4. 注释
  5. CDATA区、特殊字符,后面会说

(2)文档说明

<?xml version="1.0" encoding="utf-8" ?>
  1. XML声明放在XML文档的第一行

    • XML声明由以下几部分组成
    • version--文档符合xml1.0规范
    • encoding="utf-8"--文档字符编码

(3)元素

1、元素语法要求
  • 每个xml文档必须有且只有一个根元素
  • 根元素是一个完全包括文档中其他所有元素的元素
  • 根元素的起始标记要放在所有其他元素的起始标记之前
  • 根元素的结束标记要放在所有其他元素的结束标记之后
  • xml元素指xml文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式:
包含标签体:<a>www.baidu.com</a>
不含标签体:<a></a>,简写为:<a/>
  • 一个标签中也可以嵌套若干子标签,但所有标签必须合理嵌套,绝不允许交叉嵌套
2、xml元素命名规则
  • 区分大小写,例如

    he

    是两个不同的标记

  • 不能以数字开头
  • 不能包含空格
  • 名称中间不能包含冒号:
  • 如果标签间需要间隔,建议使用下划线,比如<book_name></book_name>

(4)属性

1、属性介绍

<student id="100">
	<name>tom</name>
</student>

2、属性值用双引号(“”)或者单引号(‘’)分隔。(如果属性值中有’‘,用"“分隔;如果属性值中有”",用’'分隔)

3、一个元素可以有多个属性,他的基本格式为:<元素名 属性名=“属性值”>

4、特定的属性名称在同一个元素标记中只能出现一次

5、属性值不能包括&字符

(5)注释

(6)CDATA节

有些内容不想让解析引擎执行,而是当作原始内容处理(即当做普通文本),可 以使用 CDATA 包括起来,CDATA 节中的所有字符都会被当作简单文本,而不是 XML 标记

1、语法

<![CDATA[
	这里可以把你输入的字符原样显示,不会解析 xml
]]>

2、可以输入任意字符(除]]>外)

3、不能嵌套

(7)转义字符

对于一些单个字符,若想显示其原始样式,也可以使用转义的形式予以处理

在这里插入图片描述

<Students>
	<student>
    	<name>tom</name>
        <age>18</age>
        <resume>年龄&lt;10</resume>
    </student>
</Students>

(8)xml小结

遵循如下规则的 XML 文档称为格式正规的 XML 文档:

  1. XML 声明语句 <?xml version="1.0" encoding="utf-8"?>
  2. 必须有且仅有一个根元素
  3. 标记大小,区分大小写的
  4. 属性值用引号
  5. 标记成对
  6. 空标记关闭
  7. 元素正确嵌套

5、DOM4j

(1)介绍

在这里插入图片描述

(2)DOM4j中,获得Document对象的方式有三种

在这里插入图片描述

这里第一个最常用。

(3)应用实例

1、使用DOM4j对students.xml文件进行增删改查
  • 重点说查询(遍历和指定查询)
  • xml增删改使用较少
2、引入dom4j 的jar包

在idea项目中创建lib文件夹用来存放jar包,把相应的jar包复制到lib文件夹下。

右击jar包添加到库中。这样就完成了jar包的引入。

3、创建students.xml文件
<?xml version="1.0" encoding="utf-8" ?>
<students>
    <student id="01">
        <name>小龙女</name>
        <gender></gender>
        <age>16</age>
        <resume>古墓派掌门人</resume>
    </student>
    <student id="02">
        <name>欧阳锋</name>
        <gender></gender>
        <age>18</age>
        <resume>白驼山,蛤蟆神功</resume>
    </student>
</students>
4、创建dom4j.java演示对xml文件的增删改查/遍历
import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.junit.Test;

import java.io.*;
import java.util.List;

/**
 * @author D
 * @version 1.0
 * @project XML
 * @description
 * @date 2024/6/4 19:21:07
 */
public class dom4j_ {
    @Test
    public void loadXML() throws DocumentException {
        //得到一个解析器
        SAXReader reader = new SAXReader();
        //Debug一下
        Document document = reader.read(new File("src\\students.xml"));
        System.out.println(document);
    }

    //遍历所有的student信息
    @Test
    public void listStus() throws DocumentException {
        //得到一个解析器
        SAXReader reader = new SAXReader();
        //Debug一下
        Document document = reader.read(new File("src\\students.xml"));
        //得到rootElement
        Element rootElement = document.getRootElement();
        //得到rootElement的student Element
        List<Element> students = rootElement.elements("student");
        //System.out.println(student.size());
        for (Element student : students) {   //element就是student元素/节点
            //获取student元素的name...
            Element name = student.element("name");
            Element age = student.element("age");
            Element gender = student.element("gender");
            Element resume = student.element("resume");
            System.out.println("学生信息="+name.getText()+" "+age.getText()+
                    " "+gender.getText()+" "+resume.getText());
        }
    }

    //指定获取第一个学生的信息 就是dom4j+xpath
    @Test
    public void readOne() throws DocumentException {
        //得到一个解析器
        SAXReader reader = new SAXReader();
        //Debug一下
        Document document = reader.read(new File("src\\students.xml"));
        //得到rootElement
        Element rootElement = document.getRootElement();

        //获取第一个学生
        Element student =(Element) rootElement.elements("student").get(1);
        System.out.println("该学生信息:"+student.element("name").getText()+" "+
                student.element("gender").getText()+" "+
                student.element("age").getText()+" "+
                student.element("resume").getText());

        //获取对应id
        System.out.println("id="+student.attributeValue("id"));

    }

    //添加元素
    @Test
    public void add() throws DocumentException, IOException {
        //得到一个解析器
        SAXReader reader = new SAXReader();
        //Debug一下
        Document document = reader.read(new File("src\\students.xml"));

        Element newStu = DocumentHelper.createElement("student");
        Element newStu_name = DocumentHelper.createElement("name");
        Element newStu_gender = DocumentHelper.createElement("gender");
        Element newStu_age = DocumentHelper.createElement("age");
        Element newStu_resume = DocumentHelper.createElement("resume");

        //赋值
        newStu.addAttribute("id","03");
        newStu_name.setText("Ghost-D");
        newStu_gender.setText("男");
        newStu_age.setText("20");
        newStu_resume.setText("略");

        //将子节点加入到newStu下
        newStu.add(newStu_name);
        newStu.add(newStu_gender);
        newStu.add(newStu_age);
        newStu.add(newStu_resume);

        //将newStu加入到根节点
        document.getRootElement().add(newStu);

        //更新xml
        //直接输出会出现中文乱码:
        OutputFormat output = OutputFormat.createPrettyPrint();
        output.setEncoding("utf-8");//输出的编码 utf-8
        //把我们的 xml 文件更新
        // lets write to a file
        //new FileOutputStream(new File("src/myClass.xml"))
        //使用到 io 编程 FileOutputStream 就是文件字节输出流
        XMLWriter writer = new XMLWriter(
                new FileOutputStream(new File("src/students.xml")), output);
        writer.write(document);
        writer.close();
    }

    //删除元素
    @Test
    public void del() throws DocumentException, IOException {
        //得到一个解析器
        SAXReader reader = new SAXReader();
        //Debug一下
        Document document = reader.read(new File("src\\students.xml"));

        //得到要删除的节点
        Element stu =(Element) document.getRootElement().elements("student").get(2);
        //删除
        stu.getParent().remove(stu);

        //更新xml
        //直接输出会出现中文乱码:
        OutputFormat output = OutputFormat.createPrettyPrint();
        output.setEncoding("utf-8");//输出的编码 utf-8
        //把我们的 xml 文件更新
        // lets write to a file
        //new FileOutputStream(new File("src/myClass.xml"))
        //使用到 io 编程 FileOutputStream 就是文件字节输出流
        XMLWriter writer = new XMLWriter(
                new FileOutputStream(new File("src/students.xml")), output);
        writer.write(document);
        writer.close();
        System.out.println("删除成功");
    }

    //修改
    @Test
    public void update() throws IOException, DocumentException {
        //得到一个解析器
        SAXReader reader = new SAXReader();
        //Debug一下
        Document document = reader.read(new File("src\\students.xml"));

        //得到所有学生的年龄
        List<Element> students = document.getRootElement().elements("student");
        //遍历
        for (Element student : students) {
            //取出年龄
            Element age = student.element("age");
            age.setText((Integer.parseInt(age.getText())+3)+"");
        }

        //更新xml
        //直接输出会出现中文乱码:
        OutputFormat output = OutputFormat.createPrettyPrint();
        output.setEncoding("utf-8");//输出的编码 utf-8
        //把我们的 xml 文件更新
        // lets write to a file
        //new FileOutputStream(new File("src/myClass.xml"))
        //使用到 io 编程 FileOutputStream 就是文件字节输出流
        XMLWriter writer = new XMLWriter(
                new FileOutputStream(new File("src/students.xml")), output);
        writer.write(document);
        writer.close();
        System.out.println("修改成功");
    }
}
5、课后作业

在这里插入图片描述

创建books.xml文件:

<?xml version="1.0" encoding="utf-8" ?>
<books>
    <book id="bj001">
        <name>天龙八部</name>
        <auther>金庸</auther>
        <price>23.4</price>
    </book>
    <book id="bj002">
        <name>三国演义</name>
        <auther>罗贯中</auther>
        <price>50.4</price>
    </book>
</books>

创建java文件:

package homework;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.List;

/**
 * @author D
 * @version 1.0
 * @project XML
 * @description
 * @date 2024/6/5 14:57:43
 */
public class homework01 {
    public static void main(String[] args) throws DocumentException {
        //得到一个解析器
        SAXReader reader = new SAXReader();
        //Debug一下
        Document document = reader.read(new File("src\\homework\\books.xml"));

        //获取book对象
        List<Element> books = document.getRootElement().elements("book");
        for (Element book : books) {
            String name = book.element("name").getText();
            String auther = book.element("auther").getText();
            double price = Double.parseDouble(book.element("price").getText());
            String id = book.attribute("id").getText();
            homework.book book1 = new book();
            book1.setId(id);
            book1.setName(name);
            book1.setAuther(auther);
            book1.setPrice(price);
            System.out.println(book1);
        }
    }
}
class book{
    private String id;
    private String name;
    private String auther;
    private double price;

    public book() {

    }

    public book(String id, String name, String auther, double price) {
        this.id = id;
        this.name = name;
        this.auther = auther;
        this.price = price;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

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

    public String getAuther() {
        return auther;
    }

    public void setAuther(String auther) {
        this.auther = auther;
    }

    public double getPrice() {
        return price;
    }

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

    @Override
    public String toString() {
        return "book{" +
                "id='" + id + '\'' +
                ", name='" + name + '\'' +
                ", auther='" + auther + '\'' +
                ", price=" + price +
                '}';
    }
}

public void setAuther(String auther) {
this.auther = auther;
}

public double getPrice() {
    return price;
}

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

@Override
public String toString() {
    return "book{" +
            "id='" + id + '\'' +
            ", name='" + name + '\'' +
            ", auther='" + auther + '\'' +
            ", price=" + price +
            '}';
}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值