dom4j将xml解析成对象实验(不断更新)

package com.sx.dom4j;

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.Iterator;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.VisitorSupport;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

/*************************************************************************/
/*
 * 本类作为对Dom4j的学习
 * 主要完成对XML文件的创建、删除操作
 * 对XML中数据的CRUD操作
 * 本次更新可以将XML文件解析成对象数组
 * 用到的实体类User已经给出
 * 注意,生成的XML文件中有两个admin属性
 * 2011.9.24
 */
/*************************************************************************/

public class Dom4j {
    
    //文件保存位置
    private static final String PATH = "D:/Temp/dom4j.xml";
    private static File file = new File(PATH);
    //用户列表
    private static ArrayList<User> userList = new ArrayList<User>();
    
    public static void main(String[] args) throws Exception{
        //创建目录
        mkdir();
        //生成XML文件
        writeXml();
        //解析XML文件,生成对象数组
        readXml();
        System.out.println("operator success!");
    }

    /**
     * 建立文件
     * */
    private static void mkdir()
    {
        File dir = new File("D:/Temp/");
        if(!(dir.exists())){
            dir.mkdirs();
        }
    }
    
    /**
     * 实现自己的访问者
     * */
    private static class MyVisitor extends VisitorSupport
    {
        public static int id;
        public static String userName;
        public static String password;
        public static boolean isAdmin;
        public static String tempAdmin;
        
        @Override
        public void visit(Attribute attr) {
            if("/userTable/user/@admin".equals(attr.getPath())) {
                if("true".equals(attr.getValue())) {
                    isAdmin = true;
                } else {
                    isAdmin = false;
                }
            }
            if("/userTable/user/userName/@admin".equals(attr.getPath())) {
                tempAdmin = attr.getValue();
            }
            
            //输出测试数据
            System.out.println("Attribute : key=" + attr.getPath());
            System.out.println("Attribute : value=" + attr.getValue());
        }

        @Override
        public void visit(Element node) {
            
            if("id".equals(node.getName())) {
                id = Integer.parseInt(node.getTextTrim());
            }
            if("userName".equals(node.getName())){
                userName = node.getTextTrim();
            }
            if("password".equals(node.getName())){
                password = node.getTextTrim();
            }
            
            //输出测试数据
            System.out.println("Element : key=" + node.getName());
            System.out.println("Element : value=" + node.getTextTrim());
        }

    }
    
    /**
     * 解析XML文件
     * */
    @SuppressWarnings("unchecked")
    private static void readXml() throws Exception {
        
        //SAXReader 生成DOM方式1
        SAXReader reader = new SAXReader();
        Document document = reader.read(file);
        
        //DOMReader 生成DOM方式2
        /*DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        org.w3c.dom.Document domDocument = db.parse(file);
        DOMReader reader = new DOMReader();
        Document document = reader.read(domDocument);*/
        
        //得到根元素
        Element root = document.getRootElement();
        
        //解析XML并生成User对象放入array list中
        Iterator<Element> iterator = root.elementIterator();
        
        while(iterator.hasNext()){
            
            Element users = iterator.next();
            
            if(users.getName().equalsIgnoreCase("user")) {
                MyVisitor visitor = new MyVisitor();
                users.accept(visitor);
                
                //设置User对象参数
                User user = new User();
                user.setId(MyVisitor.id);
                user.setPassword(MyVisitor.password);
                user.setUserName(MyVisitor.userName);
                user.setAdmin(MyVisitor.isAdmin);
                user.setTempAdmin(MyVisitor.tempAdmin);
                
                //添加User到数组
                userList.add(user);
                
            }
        }
        
        //显示测试结果
        for(User u : userList) {
            System.out.println("Id:" + u.getId() + ", UserName:" + u.getUserName() +
                    ", password:" + u.getPassword() + ", isAdmin:" + u.isAdmin() +
                    ", TempAdmin:" + u.getTempAdmin());
        }
        
        /*
         *  以下为输入的结果
         *
            Element : key=user
            Element : value=
            Attribute : key=/userTable/user/@admin
            Attribute : value=true
            Element : key=id
            Element : value=1
            Element : key=userName
            Element : value=admin
            Attribute : key=/userTable/user/userName/@admin
            Attribute : value=1
            Element : key=password
            Element : value=admin
            Element : key=user
            Element : value=
            Attribute : key=/userTable/user/@admin
            Attribute : value=false
            Element : key=id
            Element : value=2
            Element : key=userName
            Element : value=user
            Attribute : key=/userTable/user/userName/@admin
            Attribute : value=0
            Element : key=password
            Element : value=user
            Id:1, UserName:admin, password:admin, isAdmin:true, TempAdmin:1
            Id:2, UserName:user, password:user, isAdmin:false, TempAdmin:0
            operator success!
        */
        
        //使用XPath 查找对象
        /*List list = document.selectNodes("/userTable/user");
        Iterator iter = list.iterator();
        while(iter.hasNext()) {
            Element user = (Element)iter.next();
            Element id = user.element("id");
            id.setText("5");
        }*/
        
        //得到子节点,不会自动递归到子子节点
        /*Element root = document.getRootElement();
        Iterator<Element> iter = root.elementIterator();
        while(iter.hasNext()) {
            Element element = iter.next();
            System.out.println(element.getName());
        }*/
        
        //修改属性
        /*root.remove(root.attribute("lastUser"));
        root.addAttribute("maxUser", "10");*/
        /*Attribute lastUser = root.attribute("lastUser");
        lastUser.setText("5");*/
        
        //删除所有User元素中的id元素
        /*Iterator<Element> iterator = root.elementIterator();
        while(iterator.hasNext()){
            Element users = iterator.next();
            Iterator<Element> iter = users.elementIterator();
            while(iter.hasNext()){
                Element id = iter.next();
                if(id.getName().equals("id")) {
                    users.remove(id);
                }
            }
        }*/
        
        //用Xpath删除所有User元素中的id元素
        /*List ids = document.selectNodes("/userTable/user/id");
        Iterator<Element> list = ids.iterator();
        while(list.hasNext()){
            Element id = list.next();
            id.getParent().remove(id);
        }*/
        
        //添加一个新的结点
        /*Element user3 = root.addElement("user");
        Element id = user3.addElement("id");
        id.setText("3");
        Element userName = user3.addElement("userName");
        userName.setText("user3");
        Element password = user3.addElement("password");
        password.setText("user3");*/
        
        //将生成的XML保存到本地
        OutputFormat outputFormat = OutputFormat.createPrettyPrint();
        outputFormat.setEncoding("UTF-8");
        FileOutputStream fos = new FileOutputStream(file);
        XMLWriter xmlWriter = new XMLWriter(fos, outputFormat);
        xmlWriter.write(document);
        xmlWriter.close();
        
    }
    
    /**
     * 创建XML文件,生成的XML文件格式如下:
     *
     * <?xml version="1.0" encoding="UTF-8"?>
     *
     * <userTable lastUser="1">
     * <!--用户表-->  
     * <user admin="true">
     * <id>1</id>  
     * <userName admin="0">admin</userName>  
     * <password>admin</password>
     * </user>  
     * <user admin="false">
     * <id>2</id>  
     * <userName admin="0">user</userName>  
     * <password>user</password>
     * </user>
     * </userTable>
     *
     * */
    private static void writeXml() throws Exception {
        
        Document document = DocumentHelper.createDocument();
        Element root = document.addElement("userTable");
        root.addComment("用户表");
        root.addAttribute("lastUser", "1");
        
        Element user1 = root.addElement("user");
        user1.addAttribute("admin", "true");
        Element id = user1.addElement("id");
        id.setText("1");
        Element userName = user1.addElement("userName");
        userName.addAttribute("admin", "1");
        userName.setText("admin");
        Element password = user1.addElement("password");
        password.setText("admin");
        
        Element user2 = root.addElement("user");
        user2.addAttribute("admin", "false");
        Element id2 = user2.addElement("id");
        id2.setText("2");
        Element userName2 = user2.addElement("userName");
        userName2.addAttribute("admin", "0");
        userName2.setText("user");
        Element password2 = user2.addElement("password");
        password2.setText("user");
        
        OutputFormat outputFormat = OutputFormat.createPrettyPrint();
        outputFormat.setEncoding("UTF-8");
        FileOutputStream fos = new FileOutputStream(file);
        XMLWriter xmlWriter = new XMLWriter(fos, outputFormat);
        xmlWriter.write(document);
        xmlWriter.close();
        
    }
}

//实体类
class User {
    
    private int id;
    private String userName;
    private String password;
    private boolean isAdmin;
    private String tempAdmin;
    
    public String getTempAdmin() {
        return tempAdmin;
    }
    public void setTempAdmin(String tempAdmin) {
        this.tempAdmin = tempAdmin;
    }
    public boolean isAdmin() {
        return isAdmin;
    }
    public void setAdmin(boolean isAdmin) {
        this.isAdmin = isAdmin;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    
}





















































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值