Java 持久化操作之 --XML

1)有关XML简介

    XML(EXtensible Markup Language)可扩展标记语言

    特点:XML与操作系统、编程语言的开发平台无关

               实现不同系统之间的数据交换

    作用:数据交换、配置应用程序和网站

大致文档结构:

XML文档内容由一系列标签元素组成:

    

XML编写注意事项:

 所有XML元素都必须有结束标签

    XML标签对大小写敏感

    XML必须正确的嵌套

    同级标签以缩进对齐

    元素名称可以包含字母、数字或其他的字符

    元素名称不能以数字或者标点符号开始

    元素名称中不能含空格

XML中的转义符列表:

2)解析XML技术:

    DOM:

            基于XML文档树结构的解析

            适用于多次访问的XML文档

            特点:比较消耗资源

    SAX:

            基于事件的解析

            适用于大数据量的XML文档

            特点:占用资源少,内存消耗小

    DOMJ4:

            非常优秀的java XML API

            性能优异、功能强大

            开放源代码

2-1)DOM解析XML:增删改查d

    DOM介绍:文档对象模型(Document Object Model):DOM把XML文档映射成一个倒挂的树

代码演示DOM解析XML

import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class XmlText {
    //private static Document parse;
    public static void main(String[] args) throws Exception {
        // text();
        //add();
        // delete();
        //modfiy();
    }
    /**
     * 循环解析XML
     * 
     * @throws ParserConfigurationException
     * @throws SAXException
     * @throws IOException
     */
    public static void text() throws ParserConfigurationException,
            SAXException, IOException {
        // 创建工厂
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        // 1.创建解析器对象
        DocumentBuilder builder = factory.newDocumentBuilder();
        // 2.创建文档对象
        Document document = builder.parse("lbl/NewFile.xml");
        // 3.拿到节点集合
        NodeList list = document.getElementsByTagName("book");
        // 4.遍历集合
        for (int i = 0; i < list.getLength(); i++) {
            // 拿到每个节点
            Element item = (Element) list.item(i);
            // 解析每个节点属性的值
            String bookid = item.getAttribute("id");
            String bookType = item.getAttribute("type");
            System.out.println(bookid + "	" + bookType);
            // 解析每个节点的子节点的值
            String bookName = item.getElementsByTagName("bookName").item(0)
                    .getTextContent();
            String bookprice = item.getElementsByTagName("bookPrice").item(0)
                    .getTextContent();
            String bookAuthor = item.getElementsByTagName("bookAuthor").item(0)
                    .getTextContent();
            System.out.println(bookName + "	" + bookprice + "	" + bookAuthor);
        }
    }

    /**
     * 添加节点
     * 
     * @throws Exception
     */
    public static void add() throws Exception {
        // 创建工厂
        DocumentBuilderFactory newInstance = DocumentBuilderFactory
                .newInstance();
        // 创建解析器
        DocumentBuilder newDocumentBuilder = newInstance.newDocumentBuilder();
        // 创建文档对象
        Document document = newDocumentBuilder.parse("lbl/NewFile.xml");
        // 伪造节点
        Element createElement = document.createElement("book");
        // 给节点属性赋值
        createElement.setAttribute("id", "004");
        createElement.setAttribute("type", "动漫专题");
        // 伪造节点的子节点
        Element bookName = document.createElement("bookName");
        bookName.setTextContent("樱桃小丸子");
        Element bookPrice = document.createElement("bookPrice");
        bookPrice.setTextContent("20");
        Element bookAuthor = document.createElement("bookAuthor");
        bookAuthor.setTextContent("无名");
        // 将三个节点绑定到一个节点下。变成某一节点的子节点
        createElement.appendChild(bookName);
        createElement.appendChild(bookPrice);
        createElement.appendChild(bookAuthor);
        // 把新建的节点,添加到根节点下
        document.getElementsByTagName("books").item(0)
                .appendChild(createElement);
        // 将修改后的文件,重写到硬盘
        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        // 创建转换器
        Transformer transfromer = transformerFactory.newTransformer();
        // 要传入的数据源
        Source source = new DOMSource(document);
        // 要传入的路径
        Result result = new StreamResult("lbl/NewFile.xml");
        // 转换方法
        transfromer.transform(source, result);
        System.out.println("add  ok");

    }
/**
     * 修改节点
     * 
     * @throws Exception
     */
    public static void modfiy() throws Exception {
        // 创建工厂
        DocumentBuilderFactory newInstance = DocumentBuilderFactory
                .newInstance();
        // 创建解析器
        DocumentBuilder newDocumentBuilder = newInstance.newDocumentBuilder();
        // 创建文档对象
        Document document = newDocumentBuilder.parse("lbl/NewFile.xml");
        // 拿到要修改的节点
        Element item = (Element) document.getElementsByTagName("book").item(1);
        item.getElementsByTagName("bookName").item(0).setTextContent("我是测试xx");

        // 将修改后的文件,重写到硬盘
        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        // 创建转换器
        Transformer transfromer = transformerFactory.newTransformer();
        // 要传入的数据源
        Source source = new DOMSource(document);
        // 要传入的路径
        Result result = new StreamResult("lbl/NewFile.xml");
        // 转换方法
        transfromer.transform(source, result);
        System.out.println("add  ok");
    }

    /**
     * 删除节点
     * 
     * @throws Exception
     */
    public static void delete() throws Exception {
        // 创建工厂
        DocumentBuilderFactory newInstance = DocumentBuilderFactory
                .newInstance();
        // 创建解析器
        DocumentBuilder newDocumentBuilder = newInstance.newDocumentBuilder();
        // 创建文档对象
        Document document = newDocumentBuilder.parse("lbl/NewFile.xml");
        // 拿到要删除的节点
        Element item = (Element) document.getElementsByTagName("book").item(2);
        document.getElementsByTagName("books").item(0).removeChild(item);

        // 将修改后的文件,重写到硬盘
        TransformerFactory transformerFactory = TransformerFactory
                .newInstance();
        // 创建转换器
        Transformer transfromer = transformerFactory.newTransformer();
        // 要传入的数据源
        Source source = new DOMSource(document);
        // 要传入的路径
        Result result = new StreamResult("lbl/NewFile.xml");
        // 转换方法
        transfromer.transform(source, result);
        System.out.println("delete  ok");
    }
}
复制代码

2-2)使用SAX与DOM4J解析XML:增删改查读

    需要结合DOM4j架包使用:下载链接地址如下:

 

    需要先将架包引用到项目中:

代码演示如下:

import java.io.FileOutputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jXml {
    public static void main(String[] args) throws Exception {
        // 读取XML
        // reader();
        // 添加XML节点
        // addXml();
        // 修改节点数据
        // modfiy();
        // modfiy1();
        // 删除节点
        // delete();
        // delete1();
    }
    /**
     * 读取XML文件
     */
    public static void reader() throws Exception {
        // 创建读取器
        SAXReader reader = new SAXReader();
        // 读取xml文档
        Document read = reader.read("lbl/NewFile.xml");
        // 获取根节点
        Element rootElement = read.getRootElement();
        // 遍历根节点下的子节点信息
        for (Object item : rootElement.elements()) {
            // 拿到子节点下的值
            String text = ((Element) item).element("bookName").getText();
            System.out.println(text);
            // 拿到当前节点的属性值
            System.out.println(((Element) item).attribute("id").getText());
        }
    }
    /**
     * 向XML文件添加节点
     */
    public static void addXml() throws Exception {
        // 创建读取器
        SAXReader reader = new SAXReader();
        // 读取xml文档
        Document read = reader.read("lbl/NewFile.xml");
        // 获取根节点
        Element rootElement = read.getRootElement();
        // 创建要添加的节点
        Element createElement = DocumentHelper.createElement("book");
        createElement.setAttributeValue("id", "003");
        createElement.setAttributeValue("type", "测试数据");
        // 创建添加的节点的3个子节点
        Element createElement1 = DocumentHelper.createElement("bookName");
        createElement1.setText("唔明书");
        Element createElement2 = DocumentHelper.createElement("bookPrice");
        createElement2.setText("20");
        Element createElement3 = DocumentHelper.createElement("bookAuthor");
        createElement3.setText("测试");
        // 把3个子节点 添加到book节点下
        createElement.add(createElement1);
        createElement.add(createElement2);
        createElement.add(createElement3);
        // 把book子节点添加到根节点下
        rootElement.add(createElement);
        // 重新将XML写入硬盘
        OutputStream ou = new FileOutputStream("lbl/NewFile.xml");
        Writer wr = new OutputStreamWriter(ou, "utf-8");
        read.write(wr);
        wr.close();
        ou.close();
        System.out.println("add  ok");
    }
    /**
     * 修改节点信息
     */
    public static void modfiy() throws Exception {
        // 创建读取器
        SAXReader reader = new SAXReader();
        // 读取xml文档
        Document read = reader.read("lbl/NewFile.xml");
        // 获取根节点
        Element rootElement = read.getRootElement();
        // 拿到要修改的节点
        for (Object element : rootElement.elements()) {
            if (((Element) element).attribute("id").getText().equals("003")) {
                ((Element) element).element("bookName").setText("数据测试!");
                break;
            }
        }
        /**
         * ((Element) element).element("bookName").setName("数据测试!");修改节点name名称
         */
        // 重新将XML写入硬盘
        OutputStream ou = new FileOutputStream("lbl/NewFile.xml");
        Writer wr = new OutputStreamWriter(ou, "utf-8");
        read.write(wr);
        wr.close();
        ou.close();
        System.out.println("modfiy  ok");
    }
    /**
     * 修改节点信息方案二 Text
     */
    public static void modfiy1() throws Exception {
        // 创建读取器
        SAXReader reader = new SAXReader();
        // 读取xml文档
        Document read = reader.read("lbl/NewFile.xml");
        // 获取根节点
        Element rootElement = read.getRootElement();
        // 拿到要修改的节点---方式二 Text true
        @SuppressWarnings("unchecked")
        List<Object> attributes = (rootElement.elements());
        Element ment = (Element) attributes.get(1);
        ment.element("bookName").setText("青年测试");
        // 重新将XML写入硬盘
        OutputStream ou = new FileOutputStream("lbl/NewFile.xml");
        Writer wr = new OutputStreamWriter(ou, "utf-8");
        read.write(wr);
        wr.close();
        ou.close();
        System.out.println("modfiy  ok");
    }

    /**
     * 删除节点信息
     */
    public static void delete() throws Exception {
        // 创建读取器
        SAXReader reader = new SAXReader();
        // 读取xml文档
        Document read = reader.read("lbl/NewFile.xml");
        // 获取根节点
        Element rootElement = read.getRootElement();
        // 拿到要修改的节点
        for (Object element : rootElement.elements()) {
            if (((Element) element).attribute("id").getText().equals("003")) {
                rootElement.remove(((Element) element));
                break;
            }
        }
        // 重新将XML写入硬盘
        OutputStream ou = new FileOutputStream("lbl/NewFile.xml");
        Writer wr = new OutputStreamWriter(ou, "utf-8");
        read.write(wr);
        wr.close();
        ou.close();
        System.out.println("delete  ok");
    }

    /**
     * 删除节点方式二 Text true
     */
    public static void delete1() throws Exception {
        // 创建读取器
        SAXReader reader = new SAXReader();
        // 读取xml文档
        Document read = reader.read("lbl/NewFile.xml");
        // 获取根节点
        Element rootElement = read.getRootElement();
        // 拿到要修改的节点---方式二 Text true
        @SuppressWarnings("unchecked")
        List<Object> attributes = (rootElement.elements());
        Element ment = (Element) attributes.get(1);
        rootElement.remove(ment);
        // 重新将XML写入硬盘
        OutputStream ou = new FileOutputStream("lbl/NewFile.xml");
        Writer wr = new OutputStreamWriter(ou, "utf-8");
        read.write(wr);
        wr.close();
        ou.close();
        System.out.println("delete  ok");

    }
}
原文地址:https://www.cnblogs.com/SFHa/p/9104712.html