JAXB @XmlElement с большим количеством имен - PullRequest
0 голосов
/ 27 марта 2019

У меня есть 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

...