zoukankan      html  css  js  c++  java
  • 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");
    
        }
    }
  • 相关阅读:
    POJ2711 Leapin' Lizards(最大流)
    POJ3308 Paratroopers(最小割/二分图最小点权覆盖)
    POJ3084 Panic Room(最小割)
    POJ3469 Dual Core CPU(最小割)
    POJ1815 Friendship(字典序最小最小割割边集)
    HDU3395 Special Fish(最大费用任意流)
    HDU5461 Largest Point(暴力)
    POJ3184 Ikki's Story I
    POJ1637 Sightseeing tour(判定混合图欧拉回路)
    伸展树模板
  • 原文地址:https://www.cnblogs.com/SFHa/p/9104712.html
Copyright © 2011-2022 走看看