dom4j

本文介绍如何使用DOM4J库生成和解析XML文件。通过具体示例展示了创建XML文件的过程,并提供了完整的Java代码实现。此外,还展示了如何从XML文件中读取数据并映射到Java对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、要生成和解析如下格式的xml文件:

<?xml version="1.0" encoding="UTF-8"?>

<Message xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <User>
    <id>1</id>
    <name>李寻欢</name>
    <age>30</age>
    <Address>
      <id>1</id>
      <province>广东省</province>
      <city>广州市</city>
      <area>越秀区</area>
      <street>环市东路</street>
    </Address>
  </User>
</Message>

 2、两个数据实体类

      1)User类

 

/**
 * @Description: 用户
 */
public class User {
    
    private Long id;
    
    //姓名
    private String name;
    //年龄
    private Integer age;
    //地址
    private Address address;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

  2)Address类

 

/**
 * 
 * @Description: 地址
 */
public class Address {
    
    private Long id;
    //省份
    private String province;
    //城市
    private String city;
    //区县
    private String area;
    //街道
    private String street;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getArea() {
        return area;
    }

    public void setArea(String area) {
        this.area = area;
    }

    public String getStreet() {
        return street;
    }

    public void setStreet(String street) {
        this.street = street;
    }
}

 

 3、使用dom4j生成xml和解析xml的工具类

 

 

 

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

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

/**
 * 
 * @Description: Xml生成解析工具
 * @author Luxh
 */
public class XmlUtil {
    
    /**
     * 生成xml文档
     * @param user 用户信息
     * @return
     */
    private static Document generateDocument(User user) {
        
        Document document = DocumentHelper.createDocument();
        
        //添加元素 Message
        Element messageElement = document.addElement("Message");
        
        //给Message元素添加属性 xmlns:xs="http://www.w3.org/2001/XMLSchema"
        messageElement.addAttribute("xmlns:xs", "http://www.w3.org/2001/XMLSchema");
        
        //添加元素 User
        Element userElement = messageElement.addElement("User");
        
        //添加User子元素 id
        Element idElement = userElement.addElement("id");
        //给id元素赋值
        idElement.setText(String.valueOf(user.getId()));
        
        //添加User子元素 name
        Element nameElement = userElement.addElement("name");
        //给name元素赋值
        nameElement.setText(user.getName());
        
        //添加User子元素 age
        Element ageElement = userElement.addElement("age");
        //给age元素赋值
        ageElement.setText(String.valueOf(user.getAge()));
        
        //添加User子元素 Address
        Element addressElement = userElement.addElement("Address");
        
        //添加Address子元素 id
        Element addressIdElement = addressElement.addElement("id");
        //给id元素赋值
        addressIdElement.setText(String.valueOf(user.getAddress().getId()));
        
        //添加Address子元素 province
        Element provinceElement = addressElement.addElement("province");
        //给province元素赋值
        provinceElement.setText(user.getAddress().getProvince());
        
        //添加Address子元素 city
        Element cityElement = addressElement.addElement("city");
        //给city元素赋值
        cityElement.setText(user.getAddress().getCity());
        
        //添加Address子元素 area
        Element areaElement = addressElement.addElement("area");
        //给area元素赋值
        areaElement.setText(user.getAddress().getArea());
        
        //添加Address子元素 street
        Element streetElement = addressElement.addElement("street");
        //给street元素赋值
        streetElement.setText(user.getAddress().getStreet());
        
        return document;
    }
    
    /**
     * 生成xml文件
     */
    public static void generateXmlFile(User user) {
        
        Document document = generateDocument(user);
        XMLWriter out = null;
        
        BufferedWriter bw = null;
        OutputStreamWriter osw = null;
        FileOutputStream fos = null;
        
        try {
            File xmlFile = new File("D:/user.xml");//输出xml的路径
            fos = new FileOutputStream(xmlFile);
            osw = new OutputStreamWriter(fos,"UTF-8");//指定编码,防止写中文乱码
            bw = new BufferedWriter(osw);
            
            //对xml输出格式化
            OutputFormat format = OutputFormat.createPrettyPrint();
            format.setEncoding("UTF-8");
            out = new XMLWriter(bw, format);
            out.write(document);
            
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                if(out != null) {
                    out.close();
                }
                if(bw != null) {
                    bw.close();
                }
                if(osw != null) {
                    osw.close();
                }
                if(fos != null) {
                    fos.close();
                }
                
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    
    /**
     * 解析xml文件
     * @param xmlFile
     * @return
     * @throws DocumentException 
     */
    public static User analyzeXmlFile(File xmlFile) throws DocumentException {
        
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read(xmlFile);
        //获取根元素Message
        Element messageElement = document.getRootElement();
        
        //获取Message元素下的子元素
        Iterator<Element> oneLevelElementItor = messageElement.elementIterator();
        Map<String,String> userAttrMap = new HashMap<String,String>();
        Map<String,String> addressAttrMap = new HashMap<String,String>();
        
        while(oneLevelElementItor.hasNext()){
            Element e1 = oneLevelElementItor.next();
            System.out.println("Message子元素:"+e1.getName());
            //获取User元素下的子元素
            Iterator<Element> twoLevelElementItor = e1.elementIterator();
            while(twoLevelElementItor.hasNext()) {
                Element e2 = twoLevelElementItor.next();
                System.out.println("User子元素:"+e2.getName());
                userAttrMap.put(e2.getName(), e2.getText());
                
                //获取Address下的子元素
                if("Address".equals(e2.getName())) {
                    Iterator<Element> threeLevelElementItor = e2.elementIterator();
                    while(threeLevelElementItor.hasNext()) {
                        Element e3 = threeLevelElementItor.next();
                        System.out.println("Address子元素:"+e3.getName());
                        addressAttrMap.put(e3.getName(), e3.getText());
                    }
                    
                }
            }
            
        }
        
        //将解析出来的数据封装成User
        User user = new User();
        user.setId(Long.valueOf(userAttrMap.get("id")));
        user.setName(userAttrMap.get("name"));
        user.setAge(Integer.valueOf(userAttrMap.get("age")));
        
        Address address = new Address();
        address.setId(Long.valueOf(addressAttrMap.get("id")));
        address.setProvince(addressAttrMap.get("province"));
        address.setCity(addressAttrMap.get("city"));
        address.setArea(addressAttrMap.get("area"));
        address.setStreet(addressAttrMap.get("street"));
        
        user.setAddress(address);
        return user;
    }
    
    
}

 

 

 

 4、测试

 

import java.io.File;

import org.dom4j.DocumentException;
import org.junit.Test;

public class UserXmlTest {
    
    /**
     * 生成xml文件
     */
    @Test
    public void testGenerateXml() {
        
        //构造一个用户信息
        User user = new User();
        user.setId(1L);
        user.setName("李寻欢");
        user.setAge(30);
        
        Address address = new Address();
        address.setId(1L);
        address.setProvince("广东省");
        address.setCity("广州市");
        address.setArea("越秀区");
        address.setStreet("环市东路");
        
        user.setAddress(address);
        
        XmlUtil.generateXmlFile(user);
    }
    
    
    /**
     * 解析xml文件
     * @throws DocumentException 
     */
    @Test
    public void testAnalyzeXmlFile() throws DocumentException {
        File xmlFile = new File("D:/user.xml");
        User user = XmlUtil.analyzeXmlFile(xmlFile);
        System.out.println("user'name is :"+user.getName());
        System.out.println("user'address'province is :"+user.getAddress().getProvince());
    }
}

 

 

 

 

 

 

 

该项目采用dom4j从数据库表中生成xml数据 项目文档、数据库建表语句均已放置在项目中。 关键代码如下: public String getXml(Connection conn, int rm_id, String path) { //声明xml字符串 String fileString = ""; //创建DAO对象 MachineroomDao machineroom_dao = new MachineroomDao(); Cab_equipmentDao cab_equipment_dao = new Cab_equipmentDao(); Equip_configDao equip_config_dao = new Equip_configDao(); EquipmentDao equipment_dao = new EquipmentDao(); //添加room,第一层 Machineroom machineroom_dto = machineroom_dao.findById(conn, rm_id);//设置房间号 //获取个属性的值.如果为null,将属性设为"" String getMr_id = new Integer(machineroom_dto.getMr_id()).toString(); String getMr_name = machineroom_dto.getMr_name(); if(getMr_id == null) getMr_id = ""; if(getMr_name == null) getMr_name = ""; Document document = DocumentHelper.createDocument(); Element rooms_racks = document.addElement("rooms-racks"); Element room = rooms_racks.addElement("room"); room.addAttribute("id", getMr_id); room.addAttribute("name", getMr_name); room.addAttribute("isSelected", "true"); //添加rack,第二层 List<Cab_equipment> cab_equipment_list = cab_equipment_dao.findById(conn, path, machineroom_dto.getMr_id()); for (int i = 0; i < cab_equipment_list.size(); i++) { Cab_equipment cab_equipment_dto = cab_equipment_list.get(i); //获取个属性的值.如果为null,将属性设为"" String getE_id = cab_equipment_dto.getE_id(); String getEqucab_name = cab_equipment_dto.getEqucab_name(); String getX = cab_equipment_dto.getX() + ""; String getY = cab_equipment_dto.getY() + ""; String getZ = cab_equipment_dto.getZ() + ""; String getLongs = cab_equipment_dto.getLongs() + ""; String getWidth = cab_equipment_dto.getWidth() + ""; String getHighs = cab_equipment_dto.getHighs() + ""; String getRotate_angle = cab_equipment_dto.getRotate_angle(); if(getE_id == null) getE_id = ""; if(getEqucab_name == null) getEqucab_name = ""; if(getRotate_angle == null) getRotate_angle = ""; //将float后的".0"去掉 if(cab_equipment_dto.getX()%1 == 0) getX = (int)cab_equipment_dto.getX()+""; if(cab_equipment_dto.getY()%1 == 0) getY = (int)cab_equipment_dto.getY()+""; if(cab_equipment_dto.getZ()%1 == 0) getZ = (int)cab_equipment_dto.getZ()+""; if(cab_equipment_dto.getHighs()%1 == 0) getHighs = (int)cab_equipment_dto.getHighs()+""; Element rack = room.addElement("rack"); rack.addAttribute("id", getE_id); rack.addAttribute("name", getEqucab_name); rack.addAttribute("x", getX); rack.addAttribute("y", getY); rack.addAttribute("z", getZ); rack.addAttribute("lengthX", getLongs); rack.addAttribute("lengthY", getWidth); rack.addAttribute("lengthZ", getHighs); rack.addAttribute("rotation", getRotate_angle); //添加device,第三层 int u = 0;//表示需要计算的u高,其xml的属性为uplace int count = 0;//计数器,临时变量 int count2 = 0; List<Equip_config> equip_config_list = equip_config_dao.findByLocation(conn, cab_equipment_dto.getE_id()); for (int j = 0; j < equip_config_list.size(); j++) { Equip_config equip_config_dto = equip_config_list.get(j); Equipment equipment_dto = equipment_dao.findBySerial(conn, equip_config_dto.getSerial()); //获取个属性的值.如果为null,将属性设为"" String getSerial = equip_config_dto.getSerial(); String getEquipmentname = equip_config_dto.getEquipmentname(); String getEq_typecn = equipment_dto.getEq_typecn(); String getImagepath = equip_config_dto.getImagepath(); String getStorey = equip_config_dto.getStorey(); //String getU = equip_config_dto.getU() + ""; if(getSerial == null) getSerial = ""; if(getEquipmentname == null) getEquipmentname = ""; if(getEq_typecn == null) getEq_typecn = ""; if(getImagepath == null) getImagepath = ""; if(getStorey == null) getStorey = ""; int getU = equip_config_dto.getU(); //处理u高 if(getU != 0){ count++; } if(count2==0){ if(count == 1){ u = 2; } }else{ Equip_config equip_config_dto_temp = equip_config_list.get(count2 - 1); Equipment equipment_dto_temp = equipment_dao.findBySerial(conn, equip_config_dto_temp.getSerial()); int getU_temp = equip_config_dto_temp.getU(); if(count == 1){ u = 2; }else { if(getU_temp == 0){ u = u + getU_temp/10 + 0; } else { if(getU_temp == 0){ u = u + getU_temp/10 +2; }else { u = u + getU_temp/10 + 1 + 2; } } } } count2++; String uplace = u + ""; String GetU = getU + ""; if(getU == 0) { uplace = "0"; }//u高处理完毕 Element device = rack.addElement("device"); device.addAttribute("num", getSerial); device.addAttribute("name", getEquipmentname); device.addAttribute("type", getEq_typecn); device.addAttribute("image", getImagepath); //device.addAttribute("storey", getStorey);//设备所在的层数,该属性不在xml中展示 device.addAttribute("uplace", uplace);//计算得来的u高 device.addAttribute("uheight", GetU);//图片的高度 } } //设置xml输出格式 OutputFormat format = OutputFormat.createPrettyPrint(); format.setEncoding("UTF-8"); StringWriter out = new StringWriter(); XMLWriter xmlWriter = new XMLWriter(out, format); try { xmlWriter.write(document); fileString = out.toString(); xmlWriter.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } return fileString; }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值