У меня есть xml с конвертом, в конверте заголовок, в заголовке есть элемент Period с начальной датой и конечной датой.Но в некоторых случаях они называются StartDate и EndDate.Есть ли какой-то способ сказать JAXB, что нужно искать и то и другое при демаршаллинге?
У меня уже есть класс Envelope с кучей классов для всех родительских элементов, которые мне нужны, при этом каждый из них имеет дочерние элементы, если это необходимо.Одним из них является класс Period с двумя @XmlElement public String ***date
.
. Я анализирую это с помощью unmarshall, а затем обращаюсь к данным в моем InsertProcessor, чтобы поместить их в запросы и сохранить их в БД.
Я пытался использовать @XmlElements({})
, но это не сработало:
@XmlElements({
@XmlElement(name = "Startdate", type = Startdate.class),
@XmlElement(name = "StartDate", type = StartDate.class)
})
private DateStart startdate;
@XmlElements({
@XmlElement(name = "Enddate", type = Enddate.class),
@XmlElement(name = "EndDate", type = EndDate.class)
})
private DateEnd enddate;
public Startdatum getStartdate() {
return startdate;
}
public Stopdatum getEnddate() {
return enddate;
}
abstract class DateStart{}
private class Startdate extends DateStart{}
private class StartDate extends DateStart{}
abstract class DateEnd{}
private class Enddate extends DateEnd{}
private class EndDate extends DateEnd{}
при попытке доступа к нему в InsertProcessor.java с помощью env.Header.Period.getStartdate();
IDE, отвечающей Incompatible types. Required String, Found Parser.Startdatum
Sample.xml
<envelope>
<data>
<msgcode>441</msgcode>
<msgdate>201903151120000</msgdate>
</data>
<Message>
<Header>
<Period>
<Startdate>2018-05-01</Startdate> <!-- can also be StartDate -->
<Enddate>2018-05-31</Enddate> <!-- can also be EndDate -->
</Period>
</Header>
</Message>
</envelope>
Parser.java
public class Parser {
public static Envelope parse (String xml) throws JAXBException, SAXException {
JAXBContext jc;
jc = JAXBContent.newInstance(Envelope.class)
Unmarshaller u = jc.createUnmarshaller();
...
InputSource is = new InputSource(new StringReader(xml));
return (Envelope) u.unmarshal(new SAXSource(inFiler, inputSource));
}
@XmlRootElement(name="Envelope")
public static class Envelope {
@XmlElement(name = "Data")
public Data Data;
@XmlElement(name = "Message")
public Message Message;
}
...
public static class Message {
@XmlElement(name = "Header")
public Header Header;
...
}
public static class Header {
@XmlElement(name = "Period")
public Period Period;
...
}
public static class Period {
@XmlElement(name = "Startdate")
public String Startdate;
@XmlElement(name = "Enddate")
public String Enddate;
}
...
}
InsertProcessor.java:
public class InsertProcessor {
public void process(String xml) throws Exception {
Parser.Envelope env = Parser.parse(xml);
String id = env.Header.Identification;
...
String Startdate = env.Header.Period.Startdate;
String Enddate = env.Header.Period.Enddate;
try (Connection c = Db.getConnection()) {
PreparedStatement ps = c.prepareStatement("insert into...");
ps.setString(1, id)
...
ps.setString(9, Startdate);
ps.setString(10, Enddate);
ps.execute();
}
}
Так что мне нужно получить либо Start /Enddate или Start / EndDate.Прямо сейчас я только получаю Start / Enddate