• XML指可扩展标记语言,被设计用来传输和存储数据,目前主要用来做配置

一、为什么需要XML

1.需求1:两个程序间进行数据通信

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

3.能存储复杂的数据关系

<?xmlversion="1.0"encoding="UTF-8"?>
 <贾府>
 	<贾演>
 		<贾代化>
 			<贾敬></贾敬>
		 </贾代化>
	 </贾演>
	 <贾源>
	 	<贾代善>
			<贾政></贾政>
	 	</贾代善>
 	</贾源>
 </贾府>

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

1.解决程序间数据传输的问题→但目前json主流

​ 比如qq之间的数据传送,用xml格式来传送数据,具有良好的可读性、可维护性

2.xml可以做配置文件

​ xml文件做配置文件非常普遍,比如tomcat服务器的server.xml、web.xml

3.xml可以充当小型的数据库→但很多程序有自己的数据格式存放

​ xml文件做小型数据库,也是不错的选择,我们程序中可能用到的数据,如果放在数据库中读取不合适(因为你要增强维护数据库工作),可以考虑直接用xml来做小型数据库,而且直接读取文件显然要比读取数据库快

三、XML快速入门

1.需求分析/图解

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

<?xml version="1.0" encoding="UTF-8" ?>
<!--
    1. xml 表示该文件的类型为xml
    2.version="1.0" 版本
    3.encoding="UTF-8" 文件编码
    4.students root元素/根元素,只能有一个,程序员自己定
    5.<student></student> 是students的一个子元素,可以有多个
    6.id是属性 name、age、gender是student元素的子元素
-->
<students>
    <student id="001">
        <name>jun</name>
        <age>18</age>
        <gender></gender>
    </student>
    <student id="002">
        <name>mary</name>
        <age>21</age>
        <gender></gender>
    </student>
</students>

四、XML语法

​ 一个XML文件分为如下几部分内容:文档声明、元素、属性、注释、CDATA节、特殊字符

1.文档声明

(1)XML声明放在XML文档的第一行

(2)version——文档符合XML1.0规范,我们学习1.0

(3)encoding——文档字符编码。比如:“UTF-8”

2.元素

(1)元素语法要求

  • 每个XML文档必须有且只有一个根元素

  • 根元素是一个完全包括文档中其他所有元素的元素

  • 根元素的起始标记要放在所有其他元素的起始标记之前

  • 根元素的结束标记要放在所有其他元素的结束标记之后

  • XML元素指XML文件中出现的标签,一个标签分为开始标签和结束标签,一个标签有如下几种书写形式

    包含标签体:

    <a>www.hsp.cn</a>
    

    不含标签体:

    <a></a>, 简写为:<a/>
    
  • 一个标签中也可以嵌套若干个子标签,但所有标签必须合理的嵌套,绝对不允许交叉嵌套

  • student叫法:元素、节点、标签

(2)XML元素命名规则

  • 区分大小写,例如

    是两个不同的标记

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

3.属性

    <student id="001">
        <name>jun</name>
        <age>18</age>
        <gender>男</gender>
    </student>
  • 属性值用双引号(“)或单引号(‘)分隔(如果属性值有’,用"分隔;有”,用’分隔)
  • 一个元素可以有多个属性,它的基本格式为:<元素名 属性名=“属性值”>
  • 特定的属性名称在同一个元素标记中只能出现一次,比如:是错误的
  • 属性值不能包括 & 字符,比如:是错误的

4.CDATA节

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

  • 语法
<![CDATA[
这里可以把你输入的字符原样显示,不会解析xml
]]>
  • 可以输入任意字符(除]]>)
  • 不能嵌套
<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student id="001">
        <name>jun</name>
        <age>18</age>
        <gender></gender>
    </student>
    <student id="002">
        <name>mary</name>
        <age>21</age>
        <gender></gender>
    <!--
        举例说明:
        下面是一段js的代码片段,直接放在<code></code>标签间,语法错误
        使用CDATA节来处理即可
            <script data-compress="strip">
                function h(obj) {
                obj.style.behavior='url(#default#homepage)';
                var a = obj.setHomePage('//www.baidu.com/')
                }
            </script>
    -->
    <!--如果希望把某些字符串当作普通文本,使用CDATA包起来-->
        <code>
            <![CDATA[
                <script data-compress="strip">
                    function h(obj) {
                    obj.style.behavior='url(#default#homepage)';
                    var a = obj.setHomePage('//www.baidu.com/')
                    }
                </script>
            ]]>
        </code>
    </student>
</students>

格式正规的XML文档-小结

  • XML声明语句<?xml version="1.0" encoding="UTF-8" ?>
  • 必须有且仅有一个根元素
  • 标记区分大小写
  • 属性值用引号
  • 标记成对
  • 空标记要关闭
  • 元素正确嵌套

五、转义字符

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

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student id="001">
        <name>jun</name>
        <age>18</age>
        <!--
            使用转义字符表示一些特殊字符
            <resume>年龄<100 &版权</resume>
        -->
        <gender></gender>
        <resume>年龄&lt;100 &amp;版权</resume>
    </student>
    <student id="002">
        <name>mary</name>
        <age>21</age>
        <gender></gender>
    </student>
</students>

六、DOM4j

1.XML解析技术原理

(1)不管是html文件还是xml文件,它们都是标记型文档,都可以使用w3c组织指定的dom技术来解析

(2)document对象表示的是整个文档(可以是html文档,也可以是xml文档)

2.XML解析技术介绍

  • jdom在dom基础上进行了封装
  • dom4j又对jdom进行了封装
  • pull主要在Android手机开发,是在跟sax非常类似都是事件机制解析xml文件

3.DOM4j介绍

  • DOM4j是一个简单、灵活的开放源代码的库(用于解析/处理XML文件)。Dom4j是由早期开发JDOM的人分离出来而后独立开发的。
  • 与JDOM不同的是,DOM4j使用接口和抽象基类,虽然DOM4j的API相对要复杂一些,但它提供了比JDOM更好的灵活性。
  • DOM4j是一个非常优秀的Java XML API,具有性能优异。功能强大和极易使用的特点。现在很多软件采用的DOM4j。
  • 使用DOM4j开发,需下载DOM4j相应的jar文件。

4.获取Document对象

在DOM4j中,获得Document对象的方式有三种

(1)读取XML文件,获得document对象

SAXReader reader = new SAXReader();
Document document = reader.read(new File("src/input.xml"));

(2)解析XML形式的文本,得到document对象

String text = "<members></members>";
Document document = DocumentHelper.parseText(text);

(3)主动创建document对象

Document document = DocumentHelper.createDocumen();
Element root = document.addElement("members");

5.应用实例

(1)加载XML文件

  • src/students.xml
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student id="01">
    <name>小龙女</name>
    <age>16</age>
    <gender></gender>
    <resume>古墓派掌门人</resume>
</student>
<student id="02">
    <name>欧阳锋</name>
    <age>18</age>
    <gender></gender>
    <resume>白驼山,蛤蟆神功</resume>
</student>
</students>
  • Dom4j_.java
    /**
     *   演示如何加载XML文件
     */
    @Test
    public void loadXML() throws DocumentException {
        //得到一个解析器
        SAXReader reader = new SAXReader();
        //Debug看document的对象属性
        Document document = reader.read(new File("src/students.xml"));
        System.out.println(document);
    }

(2)遍历XML指定元素

	/**
     *   遍历所有的学生信息
     */
    @Test
    public void listStu() throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/students.xml"));
        //1.得到rootElement
        Element rootElement = document.getRootElement();
        //2.得到rootElement的student Elements
        List<Element> students = rootElement.elements("student");
        for (Element student: students) {//element就是student元素/节点
            //3.获取student的各个元素
            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());
        }
    }

(3)指定读取XML元素

    /**
     *   指定读取第一个学生的信息
     */
    @Test
    public void readOne() throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/students.xml"));
        //1.得到rootElement
        Element rootElement = document.getRootElement();
        //2.得到rootElement的第一个student Element
        Element student = (Element)rootElement.elements("student").get(0);
        //3.输出学生信息
        System.out.println("学生信息: " + student.element("name").getText() + " " + student.element("age").getText() +
                " " + student.element("gender").getText() + " " + student.element("resume").getText());
        //4.输出student元素的属性
        System.out.println("id=" + student.attributeValue("id"));
    }

(4)增删改操作

    /**
     *   添加元素(要求:添加一个学生到xml中)【不要求掌握,使用少,了解即可】
     */
    @Test
    public void add() throws Exception {
        //1.得到解析器
        SAXReader reader = new SAXReader();
        //2.指定解析哪个xml文件
        Document document = reader.read(new File("src/students.xml"));
        //首先创建一个学生节点对象
        Element newStu = DocumentHelper.createElement("student");
        newStu.addAttribute("id", "03");
        //创建name元素
        Element newStu_name = DocumentHelper.createElement("name");
        newStu_name.setText("宋江");
        //创建age元素
        Element newStu_age = DocumentHelper.createElement("age");
        newStu_age.setText("23");
        //创建resume元素
        Element newStu_resume = DocumentHelper.createElement("resume");
        newStu_resume.setText("梁山老大");
        //把三个子元素(节点)加到newStu下
        newStu.add(newStu_name);
        newStu.add(newStu_age);
        newStu.add(newStu_resume);
        //再把newStu节点加到根元素
        document.getRootElement().add(newStu);
        //直接输出会出现中文乱码
        OutputFormat outputFormat = OutputFormat.createPrettyPrint();
        outputFormat.setEncoding("utf-8");
        //更新xml文件
        XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/students.xml")), outputFormat);
        writer.write(document);
        writer.close();
        System.out.println("添加成功!");
    }
	/**
     *   删除元素(要求:删除一个学生)【不要求掌握,使用少,了解即可】
     */
    @Test
    public void del() throws Exception {
        //1.得到解析器
        SAXReader reader = new SAXReader();
        //2.指定解析哪个xml文件
        Document document = reader.read(new File("src/students.xml"));
        //找到该元素第三个学生
        Element stu = (Element) document.getRootElement().elements("student").get(2);
        //删除元素
        stu.getParent().remove(stu);
        //更新xml
        //直接输出会出现中文乱码
        OutputFormat outputFormat = OutputFormat.createPrettyPrint();
        outputFormat.setEncoding("utf-8");
        //更新xml文件
        XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/students.xml")), outputFormat);
        writer.write(document);
        writer.close();
        System.out.println("删除成功!");
    }
   /**
     *   更新元素(要求:把所有学生的年龄+3)【不要求掌握,使用少,了解即可】
     */
    @Test
    public void update() throws Exception {
        //1.得到解析器
        SAXReader reader = new SAXReader();
        //2.指定解析哪个xml文件
        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");
            //String -> int + 3 -> String
            age.setText((Integer.parseInt(age.getText()) + 3) + "");
        }
        //更新xml
        //直接输出会出现中文乱码
        OutputFormat outputFormat = OutputFormat.createPrettyPrint();
        outputFormat.setEncoding("utf-8");
        //更新xml文件
        XMLWriter writer = new XMLWriter(new FileOutputStream(new File("src/students.xml")), outputFormat);
        writer.write(document);
        writer.close();
        System.out.println("更新成功!");
    }

课后作业

根据给出的books.xml,创建对应的Book对象(有几个创建几个)

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

1.遍历所有的book元素→得到每个book元素的信息
2.创建一个Book类,根据book元素信息来创建book对象

public class Book {
    private Integer id;
    private String name;
    private String author;
    private Double price;


    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

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

    public Double getPrice() {
        return price;
    }

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

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                '}';
    }
}
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;

public class Homework {
    public static void main(String[] args) throws DocumentException {
        //1.得到解析器
        SAXReader reader = new SAXReader();
        //2.指定解析哪个xml文件
        Document document = reader.read(new File("src/books.xml"));
        Element rootElement = document.getRootElement();
        //3.遍历所有book元素
        List<Element> books = rootElement.elements("book");
        for (Element book : books) {
            //4.取出book元素的所有信息
            String id = book.attributeValue("id");
            String name = book.element("name").getText();
            String author = book.element("author").getText();
            String price = book.element("price").getText();
            //创建Book对象
            Book bk = new Book();
            bk.setId(Integer.parseInt(id));
            bk.setName(name);
            bk.setAuthor(author);
            bk.setPrice(Double.parseDouble(price));
            System.out.println(bk);
        }
    }
}

book : books) {
//4.取出book元素的所有信息
String id = book.attributeValue(“id”);
String name = book.element(“name”).getText();
String author = book.element(“author”).getText();
String price = book.element(“price”).getText();
//创建Book对象
Book bk = new Book();
bk.setId(Integer.parseInt(id));
bk.setName(name);
bk.setAuthor(author);
bk.setPrice(Double.parseDouble(price));
System.out.println(bk);
}
}
}


Logo

这里是“一人公司”的成长家园。我们提供从产品曝光、技术变现到法律财税的全栈内容,并连接云服务、办公空间等稀缺资源,助你专注创造,无忧运营。

更多推荐