如何将给定XML转换为Java对象并映射value标签内的指定值
Java中XML转Java对象的实现方案
首先注意:你提供的XML存在无效语法——<value id="testA" id="Y">包含重复的id属性,不符合XML规范,必须先修正(比如保留一个id,或重命名重复属性),否则所有解析工具都会报错。
下面提供两种常用的实现方式:
方法一:使用JAXB(Java自带API)
JAXB是Java原生的XML绑定工具,Java 8及之前无需额外依赖,Java 9+需手动引入jaxb-api相关模块。
1. 定义对应实体类
根据XML结构创建POJO,通过JAXB注解绑定XML元素与类字段:
import javax.xml.bind.annotation.*; import java.util.List; @XmlRootElement(name = "entities") @XmlAccessorType(XmlAccessType.FIELD) public class Entities { @XmlElement(name = "entity") private Entity entity; public Entity getEntity() { return entity; } public void setEntity(Entity entity) { this.entity = entity; } } @XmlAccessorType(XmlAccessType.FIELD) public class Entity { @XmlAttribute(name = "id") private String id; @XmlAttribute(name = "userId") private String userId; @XmlAttribute(name = "parent") private String parent; @XmlElement(name = "name") private String name; @XmlElement(name = "values") private Values values; // Getter和Setter public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getParent() { return parent; } public void setParent(String parent) { this.parent = parent; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Values getValues() { return values; } public void setValues(Values values) { this.values = values; } } @XmlAccessorType(XmlAccessType.FIELD) public class Values { @XmlElement(name = "value") private List<Value> valueList; public List<Value> getValueList() { return valueList; } public void setValueList(List<Value> valueList) { this.valueList = valueList; } } @XmlAccessorType(XmlAccessType.FIELD) public class Value { @XmlAttribute(name = "id") private String id; @XmlAttribute(name = "ID") // 适配XML中大小写不同的ID属性 private String upperId; @XmlAttribute(name = "Changed") private Boolean changed; @XmlValue // 绑定标签内的文本内容 private String content; // Getter和Setter public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUpperId() { return upperId; } public void setUpperId(String upperId) { this.upperId = upperId; } public Boolean getChanged() { return changed; } public void setChanged(Boolean changed) { this.changed = changed; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
2. 编写解析代码
import javax.xml.bind.JAXBContext; import javax.xml.bind.Unmarshaller; import java.io.StringReader; public class XmlParser { public static void main(String[] args) { try { // 替换为修正后的合法XML字符串 String xmlContent = "<entities>\n<entity id=\"1234\" userId=\"RD\" parent=\"TestID\">\n <name>AL</name>\n <values>\n <value id=\"testA\" secondaryId=\"Y\">Yes</value>\n <value id=\"testB\">750</value>\n <value id=\"testC\">3500</value>\n <value id=\"testD\">AL</value>\n <value id=\"testE\">Real</value>\n <value id=\"testF\" ID=\"A\" Changed=\"true\">Approved</value>\n <value id=\"testF\">G</value>\n <value id=\"testG\">140</value>\n <value id=\"testF\">GT</value>\n </values>\n</entity>\n</entities>"; JAXBContext context = JAXBContext.newInstance(Entities.class); Unmarshaller unmarshaller = context.createUnmarshaller(); // 解析XML为Java对象 Entities entities = (Entities) unmarshaller.unmarshal(new StringReader(xmlContent)); // 提取所有<value>标签的文本值,按需映射到目标对象 entities.getEntity().getValues().getValueList().forEach(value -> { String content = value.getContent(); System.out.println(content); // 示例:if ("Yes".equals(content)) { target.setApproved(true); } }); } catch (Exception e) { e.printStackTrace(); } } }
方法二:使用Jackson XML库
Jackson是灵活的序列化/反序列化工具,支持XML,需引入Maven依赖:
<dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.15.2</version> <!-- 建议使用最新稳定版 --> </dependency>
1. 定义实体类
import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlProperty; import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement; import java.util.List; @JacksonXmlRootElement(localName = "entities") public class Entities { @JacksonXmlProperty(localName = "entity") private Entity entity; public Entity getEntity() { return entity; } public void setEntity(Entity entity) { this.entity = entity; } } public class Entity { @JacksonXmlProperty(isAttribute = true, localName = "id") private String id; @JacksonXmlProperty(isAttribute = true, localName = "userId") private String userId; @JacksonXmlProperty(isAttribute = true, localName = "parent") private String parent; @JacksonXmlProperty(localName = "name") private String name; @JacksonXmlProperty(localName = "values") private Values values; // Getter和Setter public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getParent() { return parent; } public void setParent(String parent) { this.parent = parent; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Values getValues() { return values; } public void setValues(Values values) { this.values = values; } } public class Values { @JacksonXmlProperty(localName = "value") private List<Value> valueList; public List<Value> getValueList() { return valueList; } public void setValueList(List<Value> valueList) { this.valueList = valueList; } } public class Value { @JacksonXmlProperty(isAttribute = true, localName = "id") private String id; @JacksonXmlProperty(isAttribute = true, localName = "ID") private String upperId; @JacksonXmlProperty(isAttribute = true, localName = "Changed") private Boolean changed; @JacksonXmlText // 绑定标签内的文本 private String content; // Getter和Setter public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUpperId() { return upperId; } public void setUpperId(String upperId) { this.upperId = upperId; } public Boolean getChanged() { return changed; } public void setChanged(Boolean changed) { this.changed = changed; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } }
2. 编写解析代码
import com.fasterxml.jackson.dataformat.xml.XmlMapper; import java.io.StringReader; public class XmlParser { public static void main(String[] args) { try { String xmlContent = "修正后的合法XML字符串"; XmlMapper xmlMapper = new XmlMapper(); // 解析XML为Java对象 Entities entities = xmlMapper.readValue(new StringReader(xmlContent), Entities.class); // 提取并处理<value>文本值 entities.getEntity().getValues().getValueList().forEach(value -> { String content = value.getContent(); // 按需求映射到你的目标对象 System.out.println(content); }); } catch (Exception e) { e.printStackTrace(); } } }
额外说明
如果只需要提取<value>的文本值,不需要属性,可以简化Value类,只保留content字段和对应的注解,忽略所有属性注解。
内容的提问来源于stack exchange,提问作者Ramanuj
相关产品推荐
相关产品推荐

