Отображение XML в объект с одинаковыми именами тегов, но разными атрибутами - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь преобразовать приведенную ниже строку XML в объект Java с помощью JAXB и пакета аннотаций oxm persistence oxm.

<output>
     <rtEvent>
           <eventData name="tcppayload">
               <data>111111-000000-111111</data>
           </eventData>
           <eventData name="text">
               <data>ABCD</data>
           </eventData>
     </rtEvent>
</output>

Однако десериализация не работает.Может кто-то указать, что я могу делать неправильно.

Ниже приведен класс, который я использую для десериализации строки в объект

@XmlRootElement(name = "output")
@XmlAccessorType(XmlAccessType.FIELD)
public class CameraTriggerOutput {

       @XmlPath("/rtEvent/eventData[@name=tcppayload]/data/text()")
       private String data;

 public void toXml() {
    try {
        JAXBContext ctx = JAXBContext.newInstance(CameraTriggerOutput.class);
        Marshaller marshaller = ctx.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
        marshaller.marshal(this, System.out);
    }
    catch (Exception ex) {
        ex.printStackTrace();
    }
  }
 }

После запуска я получаю следующий вывод

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><output/>

1 Ответ

1 голос
/ 05 июня 2019

Ниже приведен код с чистым Jaxb, вы можете попробовать.

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "eventData")
public class EventData {

  private String name;

  private String data;

  @XmlElement(name = "data")
  public String getData() {
    return data;
  }

  public void setData(String data) {
    this.data = data;
  }

  @XmlAttribute(name = "name")
  public String getName() {
    return name;
  }

  public void setName(String name) {
    this.name = name;
  }
}

import java.util.List;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "rtEvent")
public class RtEvent {

  private List<EventData> edataList;

  @XmlElement(name = "eventData")
  public List<EventData> getEdataList() {
    return edataList;
  }

  public void setEdataList(List<EventData> edataList) {
    this.edataList = edataList;
  }
}

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "output")
public class Output {

  private RtEvent rtEvent;

  public RtEvent getRtEvent() {
    return rtEvent;
  }

  public void setRtEvent(RtEvent rtEvent) {
    this.rtEvent = rtEvent;
  }

  public static void main(String[] args) {
    try {
      EventData eData1 = new EventData();
      eData1.setData("111111-000000-111111");
      eData1.setName("tcppayload");

      EventData eData2 = new EventData();
      eData2.setData("ABCD");
      eData2.setName("text");

      List<EventData> eDataList = new ArrayList<>();
      eDataList.add(eData1);
      eDataList.add(eData2);

      RtEvent rtEvent = new RtEvent();
      rtEvent.setEdataList(eDataList);

      Output output = new Output();
      output.setRtEvent(rtEvent);

      JAXBContext ctx = JAXBContext.newInstance(Output.class);
      Marshaller marshaller = ctx.createMarshaller();
      marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
      marshaller.marshal(output, System.out);
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }
}

Вы Jaxb только потому, что он является частью Java, нет необходимости включать любые другие аннотации. Вы можете создавать отдельные классы в вашем ide и тестировать класс Output, у которого есть метод main.

...