dom4j解析xml,xml数据替换,生成新的xml

文章介绍了如何在Java项目中通过dom4j库解析XML文档,首先展示了pom文件中引入dom4j依赖,然后提供了一个XML示例。接着,详细展示了用dom4j解析XML并替换特定元素属性值的代码,以及涉及的关键dom4j接口如Document、Element和Attribute等。
摘要由CSDN通过智能技术生成
  • 记录一次使用dom4j处理xml

  • dom4解析xml:

    • java项目pom文件中引入插件

      • <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>
        
    • 示例xml:

      • <?xml version="1.0"?>
        <license>
            <catalog catalogId="d2434f9aff6a43fa9" catalogName="test" templateId="257d191dca684ee8968a" templateName="test" version="2014V2.0"/>
            <surface>
                <item alias="issueUnitname" catetype="0" name="test1" require="1" value="孝感市自然资源和规划局"/>
                <item alias="licenseNumber" catetype="0" name="test2" require="1" value=""/>
                <item alias="issueDate" catetype="0" name="test3" require="1" value=""/>
                <item alias="validTimeBegin" catetype="0" name="test4" require="1" value=""/>
            </surface>
            <items>
                <item alias="item_Code" name="test5" value=""/>
                <item alias="project_No" name="test6" value=""/>
            </items>
        </license>
        
    • 解析替换xml属性值的代码:

      • import org.dom4j.Document;
        import org.dom4j.DocumentHelper;
        import org.dom4j.Element;
        import org.dom4j.io.OutputFormat;
        import org.dom4j.io.XMLWriter
        
        public String modifyXml(String xml, Map<String, Object> titleValueMap){
            //最终输出修改后的xml字符串数据
            String saveXml = "";
            Document doc = null;
            try {
                // 将字符串转为XML
                doc = DocumentHelper.parseText(xml);
                // 获取根节点
                Element rootElt = doc.getRootElement();
                //获取根节点下的子节点body
                Iterator<Element> surface = rootElt.elementIterator("surface");
                // 遍历body节点
                while (surface.hasNext()) {
                    Element nextNodes = surface.next();
                    List<Element> items = nextNodes.content();
                    if (items.size() > 0){
                        for (Element item : items) {
                            String title = item.attributeValue("name");
                            if (titleValueMap.containsKey(title)){
                                item.addAttribute("value", titleValueMap.get(title).toString());
                            }
                        }
                    }
                }
            } catch (Exception e) {
                log.error("解析XML报错:{}", e);
                e.printStackTrace();
            }
            try(ByteArrayOutputStream os = new ByteArrayOutputStream()){
                OutputFormat format = new OutputFormat("", true, "UTF-8");
                XMLWriter writer = new XMLWriter(os, format);
                writer.write(doc);
                saveXml = os.toString();
            } catch (IOException e) {
                log.error("XML转字符串报错:{}", e);
                e.printStackTrace();
            }
            return saveXml;
        }
        
        
  • dom4j常用接口:

    • Attribute定义了 XML 的属性。
      Branch指能够包含子节点的节点。如XML元素(Element)和文档(Docuemnts)定义了一个公共的行为
      CDATA定义了 XML CDATA 区域
      CharacterData是一个标识接口,标识基于字符的节点。如CDATA,Comment, Text.
      Comment定义了 XML 注释的行为
      Document定义了XML 文档
      DocumentType定义 XML DOCTYPE 声明
      Element定义XML 元素
      ElementHandler定义了Element 对象的处理器
      ElementPath被 ElementHandler 使用,用于取得当前正在处理的路径层次信息
      Entity定义 XML entity
      Node为dom4j中所有的XML节点定义了多态行为
      NodeFilter定义了在dom4j 节点中产生的一个滤镜或谓词的行为(predicate)
      ProcessingInstruction定义 XML 处理指令
      Text定义 XML 文本节点
      Visitor用于实现 Visitor模式
      XPath在分析一个字符串后会提供一个 XPath 表达式
该项目采用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
发出的红包

打赏作者

小蜗牛爱远行

如果帮助到您,请作者喝个咖啡呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值