dom4J 学习

Posted kuillldan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dom4J 学习相关的知识,希望对你有一定的参考价值。

Java给我们提供了标准的W3C接口实现,已完成对XML的处理。主要有两大类,分别是DOM操作,SAX解析。DOM可以将XML加载到内存中,对XML进行方便的增删查改。由于是将整个XML都加载到内存中,所以一般说来只适合于处理比较小的XML文件。而SAX方式克服了DOM的对文件大小限制,它采用先序的方式遍历整个XML文件。也就是说SAX是有一定的顺序的执行的,一个节点一个节点的加载。这样即使XML文档很大,但不需要将其整个加载到内存中,所以SAX可以处理较大的XML文件。但SAX的缺点是不能对XML文档进行修改,只能顺序读取。

综上所诉,DOM解析和SAX解析二者各有优缺点,相互弥补。

但是毕竟我们希望能有一个统一的方式或工具能够集合DOM和SAX的优点,这样我们可以抛开底层,而专注于工具使用,从而对XML进行方便的操作,从而DOM4J就应运而生了。下面我们从几个方面来讲解DOM4J的用法。

1 在内存中创建一个Document对象。

Document document = DocumentHelper.createDocument();

2 为Document对象生成根节点

Element root = document.addElement("admins");

3 为Document生成子节点。这里我们用一个List<Admin>对象,将List中每个Admin对象加载到document对象中.使用Document的addElement()方法增加根节点。然后调用节点方法addAttribute()增加属性。调用addElement()方法增加子节点。调用addText()方法增加文本节点。

 1         for (Admin item : allAdmins)
 2         {
 3             Element admin = root.addElement("admin");
 4 
 5             admin.addAttribute("aid", item.getAid());
 6             admin.addElement("rid").addText(String.valueOf(item.getRid()));
 7             admin.addElement("type").addText(String.valueOf(item.getType()));
 8             admin.addElement("lastdate").addText(String.valueOf(item.getLastdate()));
 9             admin.addElement("flag").addText(String.valueOf(item.getFlag()));
10         }

4 将内存中的document保存到本地文件中。使用OutputFormat设置XML格式,使用XMLWriter将内存的document写到磁盘上。

1     public static void saveToFile(String path, Document document) throws Exception
2     { 
3         OutputFormat format = OutputFormat.createPrettyPrint();
4         format.setEncoding("UTF-8");
5         OutputStream os = new FileOutputStream(path);
6         XMLWriter xmlWriter = new XMLWriter(os, format);
7         xmlWriter.write(document);
8     }

5 将本地文件读取到内存中。使用SAXReader。

1     public static Document loadFromFile(String path) throws Exception
2     {
3         SAXReader reader = new SAXReader();
4         Document document = reader.read(new File(path));
5         return document;
6     }

6 对document进行更新。使用getRoot()方法可以获取根节点。使用elements()方法可以获取所有指定名称的元素节点,以List<Element>的方式返回。使用remove方法可以删除一个节点。

    public static void changeStructure(Document document)
    {
        Element root = document.getRootElement();
        List<Element> allElements = root.elements("admin");
        for(Element item : allElements)
        {
            Attribute attributeAid = item.attribute("aid");
            item.addElement(attributeAid.getName()).addText(attributeAid.getValue());
            item.remove(attributeAid);
            
        }
    }

 

 

完成代码可以参考下面:

package xmlDom.main;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.*;

import org.dom4j.*;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import xmlDom.dbc.DatabaseConnection;
import xmlDom.vo.*;

public class Hello
{
    public static void main(String[] args) throws Exception
    {
        String path = "C:\\D\\code\\resource\\newAdmin.xml";
//        List<Admin> allAdmins = findAllAdmins();
//        Document document = convertToDocument(allAdmins);
//        saveToFile(path, document);
        
        
        Document document = loadFromFile(path); 
        changeStructure(document);
        saveToFile(path, document);
        
        System.out.println("main done//~");
    }
    
    
    public static void changeStructure(Document document)
    {
        Element root = document.getRootElement();
        List<Element> allElements = root.elements("admin");
        for(Element item : allElements)
        {
            Attribute attributeAid = item.attribute("aid");
            item.addElement(attributeAid.getName()).addText(attributeAid.getValue());
            item.remove(attributeAid);
            
        }
    }

    public static void saveToFile(String path, Document document) throws Exception
    { 
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");
        OutputStream os = new FileOutputStream(path);
        XMLWriter xmlWriter = new XMLWriter(os, format);
        xmlWriter.write(document);
    }

    public static Document loadFromFile(String path) throws Exception
    {
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File(path));
        return document;
    }

    private static Document convertToDocument(List<Admin> allAdmins) throws Exception
    {
        Document document = DocumentHelper.createDocument();

        Element root = document.addElement("admins");
        for (Admin item : allAdmins)
        {
            Element admin = root.addElement("admin");

            admin.addAttribute("aid", item.getAid());
            admin.addElement("rid").addText(String.valueOf(item.getRid()));
            admin.addElement("type").addText(String.valueOf(item.getType()));
            admin.addElement("lastdate").addText(String.valueOf(item.getLastdate()));
            admin.addElement("flag").addText(String.valueOf(item.getFlag()));
        }

        return document;
    }

    /**
     * 从数据库中将数据查询出来,然后转换成内存中的XML文档
     * 
     * @return
     * @throws Exception
     */
    public static List<Admin> findAllAdmins() throws Exception
    {
        List<Admin> allAdmins = new ArrayList<Admin>();
        DatabaseConnection dbc = new DatabaseConnection();
        Connection conn = dbc.getConnection();
        String sql = " SELECT aid,rid,type,lastdate,flag FROM admin ";
        PreparedStatement ps = conn.prepareStatement(sql);
        ResultSet rs = ps.executeQuery();
        while (rs.next())
        {
            Admin admin = new Admin();
            admin.setAid(rs.getString("aid"));
            admin.setRid(rs.getInt("rid"));
            admin.setType(rs.getInt("type"));
            admin.setLastdate(rs.getDate("lastdate"));
            admin.setFlag(rs.getInt("flag"));
            allAdmins.add(admin);
        }
        return allAdmins;
    }
}

 

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

学习笔记关于DOM4J:使用DOM4J解析XML文档

dom4j学习总结

java中采用dom4j解析xml文件

dom4J 学习

XML学习笔记--dom4j操作XML

IOS开发-OC学习-常用功能代码片段整理