有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

xml解析JAXB:如何解组由多个标记或属性值组成的Java对象

我正在从SAX解析器转换到JAXB,无法理解如何将多个标记/属性值解组为单个(可兼容)Java POJO

我有如下xml文件:

<item validFrom="1950" validUntil="1980">
    <description>some text</description>
</item>

“validFrom”和“validUntil”值应组成有效的“可变范围”POJO(见下面的定义)

我需要将其解组到的Java项定义是:

@XmlRootElement
@XmlAccessorType(XmlAcccessType.FIELD)
public class Item {
    // ??? need help mapping this to be composed from "validFrom", "validUntil" attributes
    private MutableRange validRange;

    @XmlElement
    private String description;
}

// assume all other boilerplate code exists
public class MutableRange {
    private int lowerBound;
    private int upperBound;
}

我曾尝试使用适配器,但它并没有同时捕获“from”和“until”两个值来创建可变范围实例。我尝试使用@XmlMixed但没有成功

JAXB规定的实现方法是什么

一旦解决了这个问题,我将用(XmlAdapter)扩展MutableRange,作为包装器来创建番石榴的不可变范围对象,用@XmlJavaTypeAdapter(MutableRange.class)将它映射到validRange


共 (2) 个答案

  1. # 1 楼答案

    注意:我是EclipseLink JAXB (MOXy)领导和JAXB (JSR-222)专家组成员

    您可以使用MOXy的@XmlPath扩展来映射此用例:

    @XmlRootElement
    @XmlAccessorType(XmlAcccessType.FIELD)
    public class Item {
        @org.eclipse.persistence.oxm.annotations.XmlPath(".")
        private MutableRange validRange;
    
        @XmlElement
        private String description;
    }
    

    了解更多信息

  2. # 2 楼答案

    我会使用以下简单的方法:

    public interface MutableRange() {
        public int getLowerBound();
        public int getUpperBound();
        public void setLowerBound(int lowerBound);
        public void setUpperBound(int upperBound);
    }
    
    @XmlRootElement(name = "item")
    @XmlAccessorType(XmlAccessType.NONE)
    public class Item {
        @XmlAttribute(name = "validFrom")
        private int validFrom;
        @XmlAttribute(name = "validUntil")
        private int validUntil;
        @XmlElement(name = "description")
        private String description;
    
        public MutableRange getValidRange() {
            return new MutableRange() {
                public int getLowerBound() { return validFrom; }
                public int getUpperBound() { return validUntil; }
                public void setLowerBound(int lowerBound) { validFrom = lowerBound; }
                public void setUpperBound(int upperBound) { validUntil = upperBound; }
            }
        }
    
        public String getDescription() {
           return description;
        }
    }