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

使用JAXB无法读取XML的format属性问题求助

问题分析与解决方案

核心问题

你的代码错误地将format属性映射到了IssueDateTime类上,但在XML中,format是<udt:DateTimeString>元素的属性,而非<ram:IssueDateTime>的属性。同时,由于@XmlAccessorType(XmlAccessType.FIELD)的配置,直接在getter上添加注解会导致重复属性映射异常。

修复步骤

1. 创建DateTimeString类

需要单独创建一个类来表示<udt:DateTimeString>元素,同时捕获其文本值和format属性:

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlValue;

@XmlAccessorType(XmlAccessType.FIELD)
public class DateTimeString {
    @XmlValue
    private String value;
    
    @XmlAttribute(name = "format")
    private String format;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getFormat() {
        return format;
    }

    public void setFormat(String format) {
        this.format = format;
    }

    @Override
    public String toString() {
        return "DateTimeString{" +
                "value='" + value + '\'' +
                ", format='" + format + '\'' +
                '}';
    }
}

2. 修改IssueDateTime类

将原有的String dateTimeString字段替换为DateTimeString类型,并更新对应注解:

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

@XmlRootElement(name = "IssueDateTime", namespace = NamespaceMapper.RAM_URI)
@XmlAccessorType(XmlAccessType.FIELD)
public class IssueDateTime {
    @XmlElement(name = "DateTimeString", namespace = NamespaceMapper.UDT_URI)
    private DateTimeString dateTimeString;

    public DateTimeString getDateTimeString() {
        return dateTimeString;
    }

    public void setDateTimeString(DateTimeString dateTimeString) {
        this.dateTimeString = dateTimeString;
    }

    @Override
    public String toString() {
        return "IssueDateTime{" +
                "dateTimeString=" + dateTimeString +
                '}';
    }
}

3. 保留原CrossIndustryInvoice类

无需修改该类,其配置已经正确对应XML结构。

解释

  • 新的DateTimeString类通过@XmlValue捕获<udt:DateTimeString>的文本内容,@XmlAttribute捕获format属性,完美匹配XML结构。
  • 避免了原代码中属性映射位置错误的问题,同时解决了因@XmlAccessorType配置导致的重复属性异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 12:35:00