zoukankan      html  css  js  c++  java
  • dom4j和document


    DOM的优点和缺点:
    优点:DOM操作思维清晰,简单
    缺点:在操作大量数据的时候性能,不能保证


    DOM(Document Object Model)

    // 表示出需要被操作的XML文件的路径,注意是文件的路径,不是文件所在的目录
        private File f = new File("D:\workspace\dom4jAndDocument\contacts.xml");
        @Test
        public void testGetDocument() throws Exception{
            // 根据DocumentBuilderFactory类,来获取DocumentBuilderFactory对象
            // 注意:工厂设计模式往往体现着单列设计模式
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            // 根据DocumentBuilderFactory对象,创建DocumentBuilder对象
            // 注意:XxxFactory,就是用来创建Xxx对象的
            DocumentBuilder builder = factory.newDocumentBuilder();
            // 根据DocumentBuilder对象,构建Document对象
            Document parse = builder.parse(f);
            System.out.println(parse);
        }

    什么时候使用newDocument,什么时候使用parse方法呢?
      一般的,当一个XML文件已经存在,我们就只需要去解析即可. -->parse
      什么叫解析:把一个数据,从简单类型(String)转换为描述该数据的类型.
        如:String time = "2019-11-25",字符串的时间
          Date date = DateFormat对象.parse(String time)
      当一个XML文件不存在的时候,我们使用newDocument

    // 从contacts.xml文件中获取第二个联系人的名字
        @Test
        public void test1() throws Exception{
            // 1):获取Document文本对象
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document parse = builder.parse(f);
            // 2):获取XML的根元素对象:contacts.
            Element element = parse.getDocumentElement();
            // 3):获取根元素下的第二个linkman元素
            NodeList nodeList = element.getElementsByTagName("linkman");
            Node linkmanEl =(Element) nodeList.item(1);
            // 4):获取该linkman元素下的第一个name元素
            Element nameEl = (Element) ((Element) linkmanEl).getElementsByTagName("name").item(0);
            // 5):获取该name元素的文本内容.
            String name = nameEl.getTextContent();
            Assert.assertEquals("Will",name);
            System.out.println(name);
        }
    // 从contacts.xml文件中修改一个联系人的邮箱地址
        @Test
        public void test2() throws Exception{
            // 1):获取Document文本对象
            Document doc = DocumentBuilderFactory
                    .newInstance().newDocumentBuilder().parse(f);
            // 2):获取根元素对象
            Element root = doc.getDocumentElement();
            // 3):获取第一个linkman元素
            Node linkmanEl = root.getElementsByTagName("linkman").item(0);
            // 4);获取该linkman元素下的第一个email元素
            Element emailEl = (Element) ((Element) linkmanEl).getElementsByTagName("email").item(0);
            // 5):修改该email元素的文本内容
            emailEl.setTextContent("renxiaolong@520it.com");
            //  6):同步操作
            TransformerFactory factory = TransformerFactory.newInstance();
            Transformer trans = factory.newTransformer();
            Source source = new DOMSource(doc); // 内存中的Document对象
            Result result = new StreamResult(f); // 磁盘中的xml文件对象
            trans.transform(source,result);
        }
    // 从contacts.xml文件中增加一个联系人信息
        @Test
        public void test3() throws Exception{
            // 1):获取Document文本对象
            Document doc = DocumentBuilderFactory
                    .newInstance().newDocumentBuilder().parse(f);
            // 2):获取根元素对象
            Element root = doc.getDocumentElement();
            // 3):创建一个linkman元素的片段
            // 3.1:创建linkman,name,email,address,group5个元素
            Element linkmanEl = doc.createElement("linkman");
            Element nameEl = doc.createElement("name");
            Element emailEl = doc.createElement("email");
            Element addressEl = doc.createElement("address");
            Element groupEl = doc.createElement("group");
            // 3.2:设置name,email,address,group的文本内容
            nameEl.setTextContent("小明");
            emailEl.setTextContent("xaomin@520it.com");
            addressEl.setTextContent("中国");
            groupEl.setTextContent("听闻");
            // 3.3:建立元素之间的层次关系:
            // 3.3.1:把name,email,address,group四个作为linkman元素的子元素
            linkmanEl.appendChild(nameEl);
            linkmanEl.appendChild(emailEl);
            linkmanEl.appendChild(addressEl);
            linkmanEl.appendChild(groupEl);
            // 3.3.2:把linkman元素,作为根元素的子元素
            root.appendChild(linkmanEl);
            // 4):同步操作
            Transformer trans = TransformerFactory.newInstance().newTransformer();
            trans.transform(new DOMSource(doc), new StreamResult(f));
        }
    // 设置和获取第三个联系人的id属性
        @Test
        public void test4() throws Exception {
            // 1):获取Document文本对象
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(f);
            // 2):获取根元素对象
            Element element = doc.getDocumentElement();
            // 3):获取第三个linkman元素
            NodeList linkman = element.getElementsByTagName("linkman");
            Node linkmanEl =linkman.item(2);
            // 获取id属性
            String map = ((Element) linkmanEl).getAttribute("id");
            System.out.println(map);
            // 设置id属性:1234
            ((Element) linkmanEl).setAttribute("id","1234");
            // 4):同步操作
            Transformer trans = TransformerFactory.newInstance().newTransformer();
            trans.transform(new DOMSource(doc), new StreamResult(f));
        }
    // 删除第三个联系人信息
        @Test
        public void test5() throws Exception{
            // 1):获取Document文本对象
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document doc = builder.parse(f);
            // 2):获取根元素对象
            Element root = doc.getDocumentElement();
            // 3):获取第三个linkman元素
            NodeList linkman = root.getElementsByTagName("linkman");
            Node linkmanEl = linkman.item(3);
            // 4):删除第三个linkman元素
            // 请自己的老爸来干掉自己
            root.removeChild(linkmanEl);
            // 5):同步操作
            Transformer trans = TransformerFactory.newInstance().newTransformer();
            trans.transform(new DOMSource(doc), new StreamResult(f));
        }
    // 在内存中创建一个Document对象
        @Test
        public void test6() throws Exception {
            Document doc = null;
            // 如果文件存在,则直接解析
            // 如果文件不存在,则应该在内存中先创建Document对象
            DocumentBuilder builder = DocumentBuilderFactory
                    .newInstance().newDocumentBuilder();
            if (f.exists()) { // 如果文件存在
                doc = builder.parse(f);
            } else { // 如果文件不存在
                doc = builder.newDocument();
                // 设置Xml信息
                doc.setXmlVersion("1.0");
                // 创建根元素
                Element root = doc.createElement("contacts");
                // 把根元素设置为文档的儿子元素
                doc.appendChild(root);
            }
            // 获取根元素对象
            Element root = doc.getDocumentElement();
            // 创建一个linkman元素的片段
            // 创建linkman,name,email,address,group5个元素
            Element linkmanEl = doc.createElement("linkman");
            Element nameEl = doc.createElement("name");
            Element emailEl = doc.createElement("email");
            Element addressEl = doc.createElement("address");
            Element groupEl = doc.createElement("group");
            // 设置name,email,address,group的文本内容
            nameEl.setTextContent("小明");
            emailEl.setTextContent("xaomin@520it.com");
            addressEl.setTextContent("中国");
            groupEl.setTextContent("听闻");
            // 建立元素之间的层次关系:
            // 把name,email,address,group四个作为linkman元素的子元素
            linkmanEl.appendChild(nameEl);
            linkmanEl.appendChild(emailEl);
            linkmanEl.appendChild(addressEl);
            linkmanEl.appendChild(groupEl);
            // 3.3.2:把linkman元素,作为根元素的子元素
            root.appendChild(linkmanEl);
            // 同步操作
            Transformer trans = TransformerFactory.newInstance().newTransformer();
            trans.transform(new DOMSource(doc), new StreamResult(f));
        }

    DOM4j(DOM for Java(为Java提供的DOM操作的API))

    使用DOM4J需要导入的Jar包:dom4j-1.6.1.jar

    // 使用DOM4j从contacts.xml文件中查询所有联系人的信息
        private File f = new File("D:\workspace\dom4jAndDocument\contacts.xml");
        @Test
        public void testQueryAll() throws Exception{
            // 获取Document对象
            SAXReader reader = new SAXReader();
            Document read = reader.read(f);
            // 获取根元素
            Element root = read.getRootElement();
            // 获取根元素中所有的linkman元素
            List<Element> linkman = root.elements("linkman");
            for (Element like:linkman) {
                // 获取linkman元素的id属性
                String id = like.attributeValue("id");
                // 获取linkman元素下的name,email,address,group子元素的文本内容
                String name = like.elementText("name");
                String email = like.elementText("email");
                String address = like.elementText("address");
                String group = like.elementText("group");
                System.out.println(id + "," + name + "," + email + "," + address + "," + group);
            }
        }
    // 使用DOM4j新增一个联系人的信息到contacts.xml文件中
        @Test
        public void testInsert() throws Exception {
            // 获取Document对象
            SAXReader reader = new SAXReader();
            Document doc = reader.read(f);
            // 获取根元素
            Element root = doc.getRootElement();
            // 创建linkman元素,并设置为根元素的子元素
            Element linkman = root.addElement("linkman");
            // 为linkman元素设置id属性
            linkman.addAttribute("id", "4");
            // 为linkman创建子元素:name,email,address,group
            linkman.addElement("name").setText("西门吹雪");
            linkman.addElement("email").setText("飞鸽传书");
            linkman.addElement("address").setText("万梅山庄");
            linkman.addElement("group").setText("武侠");
            // 同步操作
            OutputFormat format = OutputFormat.createPrettyPrint(); // 对xml做格式化效果
            // 设置编码
            format.setEncoding("UTF-8");
            // format = OutputFormat.createCompactFormat(); // 把xml文件的数据,转换为一行
            XMLWriter writer = new XMLWriter(new FileWriter(f), format);
            writer.write(doc);
            writer.close(); // 关闭流
        }
  • 相关阅读:
    数码摄影入门之十 数码相片后期处理
    Easy CHM 2.10
    LeapFTP 3.0.0.43 汉化版(附带LeapFTP 3.0注册码)
    使用“淘宝助理”的常见错误
    “互联网浏览器”控件与webBrowser控件的区别
    易语言源代码毁来者来了!!
    易语言正则表达式的多行匹配替换
    Explorer.exe鲜为人知的参数
    原始套接字概述
    网络技术数据封装
  • 原文地址:https://www.cnblogs.com/zengqinghong/p/11996614.html
Copyright © 2011-2022 走看看