Java对象转换为XML标签,并给节点标签的i添加【id】属性,其值按照配置写入

项目场景:

场景:Java对象转换为XML标签,并给节点标签的i添加【id】属性,其值按照配置写入
示例

配置:

  • 属性名->ID_属性名
<User>
  <activity id="ID_ACTIVITY">aa</activity>
  <age id="ID_AGE">11</age>
</User>

解决方案:

思路:转换为xml字符串后,解析其每个节点,遍历子节点,如果与map里的key匹配,则取值并赋值到id属性值中,最后输出结果。

  1. 导入Jackson依赖
  2. 编写User类,Config枚举类
  3. 编写关键代码及输出结果
  1. 导入依赖
  <!-- Jackson core -->
 <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-core</artifactId>
  </dependency>
  <!-- Jackson databind -->
  <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
  </dependency>
  <!-- Jackson XML dataformat -->
  <dependency>
      <groupId>com.fasterxml.jackson.dataformat</groupId>
      <artifactId>jackson-dataformat-xml</artifactId>
  </dependency>
  1. User类设置
import lombok.Data;

@Data
public class User {
    private String activity;
    private int age;
    private Long tel;
    private Double height;

    // 定义30个String类型的属性
    private String attribute1;
    private String attribute2;
    private String attribute3;
    private String attribute4;
    private String attribute5;
    private String attribute6;
    private String attribute7;
    private String attribute8;
    private String attribute9;
    private String attribute10;
    private String attribute11;
    private String attribute12;
    private String attribute13;
    private String attribute14;
    private String attribute15;
    private String attribute16;
    private String attribute17;
    private String attribute18;
    private String attribute19;
    private String attribute20;
    private String attribute21;
    private String attribute22;
    private String attribute23;
    private String attribute24;
    private String attribute25;
    private String attribute26;
    private String attribute27;
    private String attribute28;
    private String attribute29;
    private String attribute30;
}

  1. 配置枚举类
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.util.HashMap;
import java.util.Map;

@AllArgsConstructor
@NoArgsConstructor
@Getter
public enum IdConfigEnum {
    USER_MODEL("User", getUserIdConfig());

    private String model;
    private Map<String, String> idConfigMap;

    public static IdConfigEnum getConfigByModel(String modelCode){
        for (IdConfigEnum item : IdConfigEnum.values()) {
            if (item.getModel().equals(modelCode)) {
                return item;
            }
        }
        return null;
    }

    private static Map<String, String> getUserIdConfig(){
        Map<String, String> map = new HashMap<>();
        map.put("activity", "ID_ACTIVITY");
        map.put("age", "ID_AGE");
        map.put("tel", "ID_TEL");
        map.put("height", "ID_HEIGHT");
        for (int i = 1; i <= 30; i++) {
            String key = "attribute" + i;
            String value = "ID_ATTRIBUTE" + i;
            map.put(key, value);
        }
        return map;
    }
}
  1. 编写功能代码
import com.fasterxml.jackson.dataformat.xml.XmlMapper;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.StringReader;
import java.io.StringWriter;
import java.util.Map;
import java.util.Objects;

public class Demo {
    public static void main(String[] args) throws Exception{
        User user = new User();
        user.setActivity("aa");
        user.setAge(11);
        user.setTel(1241249121L);
        user.setHeight(180.8);

        // 序列化User对象为XML字符串
        XmlMapper xmlMapper = new XmlMapper();
        String resultStr = addIdsToXml(xmlMapper.writeValueAsString(user), "User");

        System.out.println(resultStr);
    }

	/**关键代码**/
    public static String addIdsToXml(String xml, String model) {
        try {
            // 解析XML字符串为Document对象
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            Document document = builder.parse(new InputSource(new StringReader(xml)));

            //找到对应的属性名与value键值对,用于填充id值
            IdConfigEnum idConfigEnum = IdConfigEnum.getConfigByModel(model);
            if (Objects.isNull(idConfigEnum)) {
                return xml;
            }
            Map<String, String> idConfigMap = idConfigEnum.getIdConfigMap();

            // 遍历所有元素并添加id属性
            NodeList nodes = document.getElementsByTagName("*");
            for (int i = 0; i < nodes.getLength(); i++) {
                Node node = nodes.item(i);
                if (!(node instanceof Element)) {
                    continue;
                }
                Element element = (Element) node;

                //根标签不需要设置id
                if (element.getTagName().equals(model)) {
                    continue;
                }

                // 设置id属性
                String idValue = idConfigMap.getOrDefault(element.getTagName(), "");
                element.setAttribute("id", idValue);
            }

            // 将修改后的Document对象转换回XML字符串
            Transformer transformer = TransformerFactory.newInstance().newTransformer();
            transformer.setOutputProperty(OutputKeys.INDENT, "yes");
            // 可选:设置缩进量
            transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
            StringWriter writer = new StringWriter();
            transformer.transform(new DOMSource(document), new StreamResult(writer));

            return writer.toString();
        } catch (Exception e) {
            // 处理异常,例如记录日志或抛出运行时异常
            throw new RuntimeException("Error processing XML", e);
        }
    }
}

运行结果:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<User>
  <activity id="ID_ACTIVITY">aa</activity>
  <age id="ID_AGE">11</age>
  <tel id="ID_TEL">1241249121</tel>
  <height id="ID_HEIGHT">180.8</height>
  <attribute1 id="ID_ATTRIBUTE1"/>
  <attribute2 id="ID_ATTRIBUTE2"/>
  <attribute3 id="ID_ATTRIBUTE3"/>
  <attribute4 id="ID_ATTRIBUTE4"/>
  <attribute5 id="ID_ATTRIBUTE5"/>
  <attribute6 id="ID_ATTRIBUTE6"/>
  <attribute7 id="ID_ATTRIBUTE7"/>
  <attribute8 id="ID_ATTRIBUTE8"/>
  <attribute9 id="ID_ATTRIBUTE9"/>
  <attribute10 id="ID_ATTRIBUTE10"/>
  <attribute11 id="ID_ATTRIBUTE11"/>
  <attribute12 id="ID_ATTRIBUTE12"/>
  <attribute13 id="ID_ATTRIBUTE13"/>
  <attribute14 id="ID_ATTRIBUTE14"/>
  <attribute15 id="ID_ATTRIBUTE15"/>
  <attribute16 id="ID_ATTRIBUTE16"/>
  <attribute17 id="ID_ATTRIBUTE17"/>
  <attribute18 id="ID_ATTRIBUTE18"/>
  <attribute19 id="ID_ATTRIBUTE19"/>
  <attribute20 id="ID_ATTRIBUTE20"/>
  <attribute21 id="ID_ATTRIBUTE21"/>
  <attribute22 id="ID_ATTRIBUTE22"/>
  <attribute23 id="ID_ATTRIBUTE23"/>
  <attribute24 id="ID_ATTRIBUTE24"/>
  <attribute25 id="ID_ATTRIBUTE25"/>
  <attribute26 id="ID_ATTRIBUTE26"/>
  <attribute27 id="ID_ATTRIBUTE27"/>
  <attribute28 id="ID_ATTRIBUTE28"/>
  <attribute29 id="ID_ATTRIBUTE29"/>
  <attribute30 id="ID_ATTRIBUTE30"/>
</User>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值