XML

101 阅读3分钟

一、XML简介

1. 简介

XML是可扩展标记语言,标准通用标记语言的字节,是一种用于标记电子文件使其具有结构性的标记语言

XML主要用于传输数据,而不是显示数据,XML标签没有被预定义,需要自行定义,XML遵循W3C的推荐标准,具有自我描述性

link:XML 教程 (w3school.com.cn)

2. 案例

<?xml version="1.0" encoding="utf-8"?>
<!--
    xml的声明标题
    version表示xml的版本
    encoding表示编码
-->
<books>
    <book id="100001">
        <name>红楼梦</name>
        <author>曹雪芹</author>
        <price>49.9</price>
    </book>
    <book id="100002">
        <name>西游记</name>
        <author>吴承恩</author>
        <price>48.9</price>
    </book>
    <book id="100003">
        <name>水浒传</name>
        <author>施耐庵</author>
        <price>50.9</price>
    </book>
    <book id="100004">
        <name>三国演义</name>
        <author>罗贯中</author>
        <price>45.9</price>
    </book>
</books>

3. XML解决的问题

  1. xml可以解决程序间数据的传输问题,都使用xml格式会易读、可维护
  2. xml可以用来做配置文件,很多xml格式的文件都被用作项目的配置文件
  3. xml甚至可以作为小型的数据库,将数据直接存储在文件中,直接读取该文件获取配置

二、XML语法

1. XML包含以下几个部分

  1. 文档声明
  2. 元素
  3. 属性
  4. 注释
  5. CDATA区、特殊字符等

2. 注释

<!--xml注释-->

3. 元素

语法要求:

  • 每个XML文档有且只有一个根元素
  • 根元素包含其他所有元素
  • 元素标签是可以嵌套的
  • 元素名称区分大小写,不能以数字开头,不能包含空格和冒号
  • 标签的属性值需要用双引号或单引号分割
  • 一个元素可以有多个属性值,属性值不能包括&符号
<Student ID="100">
</Student>

4. CDATA节

当有些内容不想被解析引擎执行,而是展示原始内容,可以使用CDATA包起来,这样CDATA中间的文本会直接展示出来

<![CDATA[文本内容]]>

<?xml version="1.0" encoding="utf-8"?>
<foods>
    <food>
        <![CDATA[
            <meal>
            </meal>
        ]]>
    </food>
</foods>

5. 常用的转义字符

img

例子:

<?xml version="1.0" encoding="utf-8"?>
<foods>
    <food>
        <!--
            年龄 < 50  这样会报错
        -->
        年龄 &lt; 50岁
    </food>
</foods>

三、DOM4j

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

Dom4j是一个Java库,用于处理xml文件,是一次性把xml文件读取到内存中,读取xml文件时,必须一层一层的进行读取,不能直接读取某一个标签

看看如何解析xml文件,可以按照如下的格式放入文件

Dom4j jar包下载地址:Central Repository: dom4j/dom4j (maven.org)

image-20230920214445542

test_parse文件是需要被转话的xml文件:

<?xml version="1.0" encoding="utf-8"?>
<books>
    <book>
        <number>0001</number>
        <bookName>人类简史</bookName>
        <price>99.9</price>
    </book>
    <book>
        <number>0002</number>
        <bookName>解放战争</bookName>
        <price>79.9</price>
    </book>
</books>

1)解析元素,下面是Java code:

package com.oliver;

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

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

public class TestParseXML {
    public static void main(String[] args) throws DocumentException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("xmls\\test_parse.xml"));
        Element rootElement = document.getRootElement();
        List<Element> books = rootElement.elements("book");
        for (Element book:books){
            Element number = book.element("number");
            Element bookName = book.element("bookName");
            Element price = book.element("price");
            System.out.println("number = " + number.getText() + "\nbookName = " + bookName.getText() + "\nprice = " + price.getText());
        }
    }
}

看一下效果,打印了一些warning和有用的book信息:

image-20230920214713864

2)添加一个book元素:

package com.oliver;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

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

public class TestParseXML {
    public static void main(String[] args) throws DocumentException, IOException {

        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("xmls\\test_parse.xml"));
        
        Element new_book = DocumentHelper.createElement("book");
        new_book.addAttribute("id","03");
         
        Element new_book_number = DocumentHelper.createElement("number");
        Element new_book_name = DocumentHelper.createElement("name");
        Element new_book_price = DocumentHelper.createElement("price");
        
        new_book_name.setText("黄金时代");
        new_book_number.setText("0003");
        new_book_price.setText("39.9");
        new_book.add(new_book_number);
        new_book.add(new_book_name);
        new_book.add(new_book_price);

        Element rootElement = document.getRootElement();
        rootElement.add(new_book);

        OutputFormat output = OutputFormat.createPrettyPrint();
        output.setEncoding("utf-8");

        XMLWriter writer = new XMLWriter(new FileOutputStream(new File("xmls\\test_parse.xml")));
        writer.write(document);
        writer.close();
    }
}

最终得到的效果如下:

image-20230920220323903

3)删除某一个元素:

package com.oliver;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

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

/**
 * @author :16140
 * @description :
 * @create :2023-09-20 21:08:00
 */
public class TestParseXML {
    public static void main(String[] args) throws DocumentException, IOException {

        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("xmls\\test_parse.xml"));
        Element rootElement = document.getRootElement();
        Element book = (Element) rootElement.elements("book").get(2);
        book.getParent().remove(book);

        OutputFormat output = OutputFormat.createPrettyPrint();
        output.setEncoding("utf-8");

        XMLWriter writer = new XMLWriter(new FileOutputStream(new File("xmls\\test_parse.xml")));
        writer.write(document);
        writer.close();
    }
}

最终效果:

image-20230920222742100

4)更新一个元素:

package com.oliver;

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

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

public class TestParseXML {
    public static void main(String[] args) throws DocumentException, IOException {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("xmls\\test_parse.xml"));
        List<Element> books = document.getRootElement().elements("book");

        for(Element book: books){
            Element price = book.element("price");
            price.setText((Integer.parseInt(price.getText()) + 3) + "");
        }

        OutputFormat output = OutputFormat.createPrettyPrint();
        output.setEncoding("utf-8");//输出的编码 utf-8

        XMLWriter writer = new XMLWriter(new FileOutputStream(new File("xmls\\test_parse.xml")));
        writer.write(document);
        writer.close();
    }
}