zoukankan      html  css  js  c++  java
  • 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;
        }
    }
  • 相关阅读:
    [daily][archlinux][mdadm][RAID] 软RAID
    [daily] pandoc
    [knownledge][latex] LaTex入门
    [daily][mariadb][mysql] mariadb快速设置
    [daily][archlinux][btrfs][mysql] 在btrfs上使用mariadb
    [daily][archlinux][game] 几个linux下还不错的游戏
    [daily][gnucash] 复式记账
    [development][suricata] linux下一代权限控制 capabilities
    [DPI][suricata] suricata 配置使用
    [DPI][suricata] suricata-4.0.3 安装部署
  • 原文地址:https://www.cnblogs.com/kuillldan/p/6231137.html
Copyright © 2011-2022 走看看