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

使用JAXB将XML标签内容存储至不同命名变量的技术问题

解决JAXB绑定XML标签到不同变量名的问题

嘿,这个问题我之前也踩过坑!JAXB根本不需要变量名和XML标签名必须一致,用@XmlElement注解就能轻松搞定自定义映射,我结合你给的XML示例一步步教你怎么做:

首先先把你的XML补全(看你输入的最后一个标签是DATAGENERATIO,应该是打漏了最后一个字母?我假设是DATAGENERATION,如果实际是其他名称,后续修改注解里的对应值就行):

<?xml version="1.0" encoding="UTF-8"?>
<PORTAL>
    <NAME>PERSON 2.0</NAME>
    <ID>99995</ID>
    <DATAGENERATION>2008-04-10</DATAGENERATION>
</PORTAL>

第一步:创建对应的实体类,用@XmlElement指定标签映射

比如你想把<NAME>存到portalName变量,<ID>存到portalId,<DATAGENERATION>存到generateDate,实体类这么写:

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "PORTAL") // 指定根标签名
public class Portal {
    // 用name属性指定对应的XML标签名,完全不用管变量名和标签名是否一致
    @XmlElement(name = "NAME")
    private String portalName;
    
    @XmlElement(name = "ID")
    private Integer portalId;
    
    @XmlElement(name = "DATAGENERATION")
    private String generateDate;

    // 必须保留无参构造函数,JAXB反序列化时需要用它创建对象
    public Portal() {}

    // 生成getter和setter方法,方便后续获取变量值
    public String getPortalName() {
        return portalName;
    }

    public void setPortalName(String portalName) {
        this.portalName = portalName;
    }

    public Integer getPortalId() {
        return portalId;
    }

    public void setPortalId(Integer portalId) {
        this.portalId = portalId;
    }

    public String getGenerateDate() {
        return generateDate;
    }

    public void setGenerateDate(String generateDate) {
        this.generateDate = generateDate;
    }
}

第二步:编写解析String类型XML的代码

接下来把存储在String里的XML解析成刚才的实体类对象,就能通过自定义变量名获取内容了:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import java.io.StringReader;

public class XmlParser {
    public static void main(String[] args) {
        // 假设你的XML字符串存在这里
        String xmlStr = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                "<PORTAL>\n" +
                "    <NAME>PERSON 2.0</NAME>\n" +
                "    <ID>99995</ID>\n" +
                "    <DATAGENERATION>2008-04-10</DATAGENERATION>\n" +
                "</PORTAL>";

        try {
            // 初始化JAXB上下文,关联我们的实体类
            JAXBContext context = JAXBContext.newInstance(Portal.class);
            Unmarshaller unmarshaller = context.createUnmarshaller();
            
            // 把String转成Reader,再解析成Portal对象
            StringReader reader = new StringReader(xmlStr);
            Portal portal = (Portal) unmarshaller.unmarshal(reader);
            
            // 现在就可以用自定义的变量名获取XML里的内容了
            System.out.println("门户名称:" + portal.getPortalName());
            System.out.println("门户ID:" + portal.getPortalId());
            System.out.println("生成日期:" + portal.getGenerateDate());
            
        } catch (JAXBException e) {
            e.printStackTrace();
        }
    }
}

关键点说明

  • @XmlRootElement(name = "PORTAL"):指定当前类对应XML的根标签<PORTAL>
  • @XmlElement(name = "标签名"):核心注解,告诉JAXB“这个变量对应XML里的哪个标签”,彻底摆脱变量名和标签名必须一致的限制
  • 无参构造函数是硬性要求:JAXB在反序列化XML到Java对象时,必须通过无参构造函数创建实例
  • 如果你的XML带有命名空间,还可以用@XmlNamespace注解配合处理,不过你的示例里没有,暂时不用考虑

这样就能完美实现把XML标签内容存到自定义名称的变量里啦!

内容的提问来源于stack exchange,提问作者Pistacho Olvidado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:12:13