В Java, когда я анализирую XML для объекта, как я могу аннотировать свой элемент, который должен быть моим классом, а не моим корневым элементом для XML

#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.