将XML属性解组为对象值
问题描述:
我正在研究一个学校项目,我必须将某些XML值从API绑定到Java对象。我能够获得所有元素,但我无法获得特定元素的属性。我四处寻找解决方案,但找不到一个解决方案。将XML属性解组为对象值
我有一段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对象吗?
答
下添加如下DepartureTrack JAXB生成类的“修改”属性:
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement
public class DepartureTrack {
@XmlAttribute
protected String changes;
@XmlValue;
protected String content;
}
答
应该对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; }
}
}
和存在提供创建Java类的几个网站来自xml或json。
+0
问题是关于JAXB,而不是简单的XML。 –
正确的。如果属性只包含布尔值文字(并且这些是必需的),您也可以将String更改为布尔值(或布尔值)。 –