博客
关于我
Java 持久化操作之 --XML
阅读量:430 次
发布时间:2019-03-06

本文共 12030 字,大约阅读时间需要 40 分钟。

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

 
 
package text;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 + "\t" + 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 + "\t" + bookprice + "\t" + 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 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 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");    }}

 

 

 

 

 

转载地址:http://gdoyz.baihongyu.com/

你可能感兴趣的文章
(C++11/14/17学习笔记):线程启动、结束,创建线程多法、join,detach
查看>>
趣谈win10常用快捷键
查看>>
IDEA出现问题:Received fatal alert: protocol_version 解决方案
查看>>
Airtest自动化测试 Docs airtest.core.android package
查看>>
11.2.6 时间值的小数秒
查看>>
Redis源码分析(七)--- zipmap压缩图
查看>>
Oracle 11G环境配置
查看>>
【Python】(十二)IO 文件处理
查看>>
【Oozie】(三)Oozie 使用实战教学,带你快速上手!
查看>>
C语言的数值溢出问题(上)
查看>>
vue项目通过vue.config.js配置文件进行proxy反向代理跨域
查看>>
android:使用audiotrack 类播放wav文件
查看>>
ACM/NCPC2016 C Card Hand Sorting(upc 3028)
查看>>
SLAM学习笔记-求解视觉SLAM问题
查看>>
程序员应该知道的97件事
查看>>
shell编程(六)语言编码规范之(变量)
查看>>
vimscript学习笔记(二)预备知识
查看>>
Android数据库
查看>>
HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
查看>>
23种设计模式一:单例模式
查看>>