项目场景:
场景:Java对象转换为XML标签,并给节点标签的i添加【id】属性,其值按照配置写入
示例:
配置:
- 属性名->ID_属性名
<User>
<activity id="ID_ACTIVITY">aa</activity>
<age id="ID_AGE">11</age>
</User>
解决方案:
思路:转换为xml字符串后,解析其每个节点,遍历子节点,如果与map里的key匹配,则取值并赋值到id属性值中,最后输出结果。
- 导入Jackson依赖
- 编写User类,Config枚举类
- 编写关键代码及输出结果
- 导入依赖
<!-- 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>
- 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;
}
- 配置枚举类
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;
}
}
- 编写功能代码
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>