dom4j和document

Posted zengqinghong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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(); // 关闭流
    }

 

 

以上是关于dom4j和document的主要内容,如果未能解决你的问题,请参考以下文章

Dom4j中使用asXML方法之节点自闭和问题

使用XPath技术快速获取节点

dom4j之小小工具

解析和操作XML文件

org.dom4j.Document的主要用法

使用dom4j写xml文件——源码