#java #xml #parsing #annotations #unmarshalling
#java #xml #синтаксический анализ #аннотации #отмена сопоставления
Вопрос:
У меня есть xml, который выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<input>
<flight flight="LX179" dep="SIN" arr="ZRH" aircraftRegistration="HBJMN"
paxWeight="10000" />
</input>
И я использовал jaxb, чтобы привязать его к объекту
Итак, мой класс выглядит так: если я удаляю входной тег из xml и отправляю общедоступный класс в мой @rootElement, тогда он работает нормально, но это не хорошо для меня, они мне нужны там… пожалуйста, кто-нибудь может помочь с этим?
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "input")
@XmlElement //I GOT THE ERROR HERE
public class Flight {
private String flight,dep,arr,aircraftRegistration;
private int paxWeight;
public Flight() {
}
public Flight(String flight, String dep, String arr, String aircraftRegistration,
int paxWeight, ) {
this.flight = flight;
this.dep = dep;
this.arr = arr;
this.aircraftRegistration = aircraftRegistration;
this.paxWeight = paxWeight;
public String getFlight() {
return flight;
}
@XmlAttribute
public void setFlight(String flight) {
this.flight = flight;
}
public String getDep() {
return dep;
}
@XmlAttribute
public void setDep(String dep) {
this.dep = dep;
}
public String getArr() {
return arr;
}
@XmlAttribute
public void setArr(String arr) {
this.arr = arr;
}
public String getAircraftRegistration() {
return aircraftRegistration;
}
@XmlAttribute
public void setAircraftRegistration(String aircraftRegistration) {
this.aircraftRegistration = aircraftRegistration;
}
public int getPaxWeight() {
return paxWeight;
}
@XmlAttribute
public void setPaxWeight(int paxWeight) {
this.paxWeight = paxWeight;
}
Мой метод синтаксического анализа
private void beolvasas() {
try {
File file = new File("/input.xml");
JAXBContext jaxbContext = JAXBContext.newInstance(Input.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Input flight = (Input) jaxbUnmarshaller.unmarshal(file);
flightList.add(flight);
} catch (JAXBException ex) {
ex.printStackTrace();
}
}
private void kiir() {
for (Input input : flightList) {
System.out.println(input);
}
}
Мой входной класс выглядит следующим образом:
@XmlRootElement
public class Input {
private Flight flight;
@XmlRootElement
public class Input {
private List<Flight> lista;
public Input() {
}
public Input(List<Flight> list) {
this.lista = lista;
}
public List<Flight> getList() {
return lista;
}
@XmlElement
public void setList(List<Flight> list) {
this.lista = list;
}
Это последний XML-файл…
<?xml version="1.0" encoding="UTF-8"?>
<masterdata>
<airlines>
<airline id="1" name="Lufthansa" code="LH" minUnderload="1000"/>
<airline id="2" name="Swiss" code="LX" minUnderload="500" />
</airlines>
<aircraftTypes>
<aircraftType id="380" name="Airbus 380-800" maxZFW="361000" maxLAW="386000" maxTOW="560000" maxTXW="562000" maxFuel="256000"/> <aircraftType id="747" name="Boeing 747-8" maxZFW="295289" maxLAW="312072" maxTOW="447696" maxTXW="449056" maxFuel="193280"/>
<aircraftType id="340" name="Airbus 340-600" maxZFW="245000" maxLAW="259000" maxTOW="368000" maxTXW="369200" maxFuel="163600"/>
</aircraftTypes>
<aircrafts>
<aircraft id="11" ownerAirlineId="1" registration="DAIML" typeId="380" startw="276800" />
<aircraft id="12" ownerAirlineId="1" registration="DABVT" typeId="747" startw="162400" />
<aircraft id="13" ownerAirlineId="1" registration="DAIHQ" typeId="340" startw="177020" />
<aircraft id="21" ownerAirlineId="2" registration="HBJMN" typeId="340" startw="176445" />
</aircrafts>
Комментарии:
1. Если вы удалите какой тег? Очень неясно, в чем проблема. Пожалуйста, уточните.
2. Извините, я имею в виду, если я удалю входной тег
3. Почему бы вам просто не провести рефакторинг и не создать POJO, для
<input>
которого содержитFlight
(или больше)?4. Вы имеете в виду вместо этого создать входной класс, содержащий полет?
5. Создайте
Input
класс иFlight
класс. ПустьInput
класс содержит переменную типаFlight
.
Ответ №1:
Теоретически у вас есть это
<input>
<flight flight="LX179" dep="SIN" arr="ZRH" aircraftRegistration="HBJMN"
paxWeight="10000" />
<flight flight="LX178" dep="SIN" arr="YUL" aircraftRegistration="ABCDE"
paxWeight="10000" />
</input>
Следовательно, у вас есть коллекция <flight>
элементов внутри одного <input>
элемента. Вы должны смоделировать это с помощью Java.
public class Input {
public List<Flight> lista;
}
public class Flight {}
Как только у вас это будет, вы должны добавить соответствующие аннотации. <input>
является корневым элементом, поэтому Input
должен быть корневым элементом.
@XmlRootElement(name = "input")
public class Input {
У него есть коллекция элементов, вызываемых <flight>
, поэтому это поле должно быть аннотировано
@XmlElement(name = "flight")
public List<Flight> lista;
Комментарии:
1. Ах @Sotirios Извините, но я снова застрял с моим последним XML-файлом (я скопировал в конец вопроса), я попытался перейти к логике, которую вы показывали ранее, но здесь мне нужен
masterdata
класс, который будет корневым элементом, который имеет этот классairlines
,aircraftTypes
, иaircrafts
класс и аннотированный какXmlelement
идля каждого из этих классов естьList<airline>
,List<aircraftType>
, и т. Д., И Они также аннотируются как Xmlelement ? и в конце я получил базовые классы airline, aircraft и aircraftType со свойствами?2. @gua Этот XML (как показано) недействителен. У вас может быть только один корневой элемент.
3. Вы уверены? Таким образом, нет возможности проанализировать его в этой структуре?
4. @gua Вам нужен действительный XML.