You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将给定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:35:31