gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:48:50 32 4
gpt4 key购买 nike

我正在尝试使用 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/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com