java - 将 XML 映射到具有相同标签名称但不同属性的对象

标签 java xml jaxb moxy

我正在尝试使用 JAXB 和 eclipse persistence oxm 注释包将下面的 XML 字符串转换为 Java 对象。

<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/>

最佳答案

下面我提供了纯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 中创建单独的类,并且可以测试具有 main 方法的 Output 类。

关于java - 将 XML 映射到具有相同标签名称但不同属性的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56466725/

相关文章:

java - Jackson 仍然提示缺少过滤器 ID/跳过缺少的过滤器

Java线程和线程中断

xml - 使用 maven-replacer-plugin 替换 XML 元素内容时出错

java - JAXB 将 XML 片段映射为另一个 XML 文档中的片段

java - 无法创建具有特定类的 JAXB 实例

java - 如何获取 XmlType#name 的有效默认值?

java - 在 2 个排序数组(每个数组中有 1 个值)中找到值对,其中总和最接近目标值

java - 有没有办法访问 Springframework 存储库 "refresh"?

xml - XSLT:如何在另一个模板中重用一个模板

Java/Android 良好的 XML 读取 API