【问题标题】:Unmarshal XML attribute to object value将 XML 属性解组为对象值
【发布时间】:2017-07-27 14:37:45
【问题描述】:

我正在做一个学校项目,我必须将一些 XML 值从 API 绑定到 java 对象。我能够获取所有元素,但是我无法获取特定元素的属性。我四处寻找解决方案,但找不到。

我有这段 XML 代码,我想用 JAXB 将其解组为 Java 对象。我想获得的属性是 Departuretrack 中的“更改”。

<Departures>
    <DepartingTrain>
        <Id>220</Id>
        <DepartureTime>2017-03-07T11:03:00+0100</DepartureTime>
        <DepartureTrack changes="false">5</DepartureTrack>
    </DepartingTrain>
    <DepartingTrain>
        <Id>637</Id>
        <DepartureTime>2017-03-07T11:18:00+0100</DepartureTime>
        <DepartureTrack changes="false">12</DepartureTrack>
    </DepartingTrain>
</Departures>

我目前确实有这个对象,它适用于所有元素。我不知道如何获取“更改”属性并将其放入此对象中。

@Entity
@Getter
@Setter
@NoArgsConstructor
@XmlRootElement(name="Departures")
@XmlAccessorType(XmlAccessType.FIELD)
public class Departure {
    @Id
    @GeneratedValue
    private long id;
    @XmlElement(name="Id")
    private int routeNumber;
    @XmlElement(name="DepartureTime")
    private String departureTime;
    @XmlElement(name="DepartureTrack")
    private String departureTrack;
}

我创建了一个包含此对象的所有离开的列表。

@Entity
@Getter
@Setter
@NoArgsConstructor
@XmlRootElement(name="Departures")
@XmlAccessorType(XmlAccessType.FIELD)
public class DepartureList {

    @Id
    @GeneratedValue
    private long id;
    @XmlElement(name="DepartingTrain")
    @OneToMany
    private List<Departure> departures = new ArrayList<>();
}

这就是我的解组器的样子。

// Returns all departures for a specific station
public DepartureList getDepartingTrains(String station){
    try {
        URL url = new URL("API URL" + station);
        URLConnection urlConnection = url.openConnection();
        urlConnection.setRequestProperty("Authorization", "Basic " + authStringEnc);
        InputStream is = urlConnection.getInputStream();
        InputStreamReader isr = new InputStreamReader(is);

        Unmarshaller unmarshaller = departureListJaxbContext.createUnmarshaller();
        DepartureList departureList = (DepartureList) unmarshaller.unmarshal(isr);
        return departureList;
    } catch (JAXBException e) {
        e.printStackTrace();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    // Throw Exception
    return null;
}

有谁知道如何从 XML 表单中获取此属性并将其放入 Java 对象中?

【问题讨论】:

    标签: java spring jaxb unmarshalling


    【解决方案1】:

    在 DepartureTrack JAXB Generated 类下添加“changes”属性,如下所示:

    import javax.xml.bind.annotation.*;
    
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlRootElement
    public class DepartureTrack {
    
        @XmlAttribute
        protected String changes;
    
     @XmlValue;
    protected String content;
    
    }
    

    【讨论】:

    • 正确。如果属性仅包含布尔值文字(并且这些是必需的),您还可以将 String 更改为 Boolean(或 boolean)。
    • 对我来说,它抛出 java.xml.bind.UnmarshalException :意外元素(uri:“false”,local:“DepartureTrack”)。预期元素是
    【解决方案2】:

    你应该有像下面这样的java类

    import org.simpleframework.xml.Attribute;
    import org.simpleframework.xml.Element;
    import org.simpleframework.xml.ElementList;
    import org.simpleframework.xml.Root;
    
    import java.math.BigDecimal;
    import java.util.List;
    
    @Root(name = "Departures")
    public class Departures {
    
        @ElementList(name = "DepartingTrain", inline = true, required = false)
        List<DepartingTrain> departingTrain;
    
    
    
        public List<DepartingTrain> getDepartingTrain() { return this.departingTrain; }
        public void setDepartingTrain(List<DepartingTrain> _value) { this.departingTrain = _value; }
    
    
    
        public static class DepartingTrain {
    
            @Element(name="Id", required = false)
            String id;
    
    
            @Element(name="DepartureTime", required = false)
            String departureTime;
    
    
            @Element(name="DepartureTrack", required = false)
            DepartureTrack departureTrack;
    
    
    
            public String getId() { return this.id; }
            public void setId(String _value) { this.id = _value; }
    
    
            public String getDepartureTime() { return this.departureTime; }
            public void setDepartureTime(String _value) { this.departureTime = _value; }
    
    
            public DepartureTrack getDepartureTrack() { return this.departureTrack; }
            public void setDepartureTrack(DepartureTrack _value) { this.departureTrack = _value; }
    
    
        }
    
        public static class DepartureTrack {
    
            @Attribute(name="changes", required = false)
            Boolean changes;
    
    
    
            public Boolean getChanges() { return this.changes; }
            public void setChanges(Boolean _value) { this.changes = _value; }
    
    
        }
    }
    

    很少有网站提供从 xml 或 json 创建 java 类。

    【讨论】:

    • 问题是关于 JAXB,而不是简单 XML。
    猜你喜欢
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2016-11-09
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多