gpt4 book ai didi

带有 JAXB 类包装器的 Java Unmarshal 对象列表

转载 作者:数据小太阳 更新时间:2023-10-29 02:01:31 26 4
gpt4 key购买 nike

我从 BaseX 服务器执行的 XQuery 中得到这样的结果:

<ProtocolloList>
<protocollo>
<numero>1</numero>
<data>2014-06-23</data>
<oggetto/>
<destinatario/>
<operatore/>
</protocollo>
...
</ProtocolloList>

我需要使用 JAXB 将此结果转换为 Protocollo 对象列表,以便我可以使用 JList 显示它们。因此,以下讨论之一 here我已经声明了以下类:

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

@XmlRootElement(name = "protocollo")
public class Protocollo {

private int numero;
private String data;
private String oggetto;
private String destinatario;
private String operatore;

public Protocollo(String d, String o, String des, String op) {
this.data = d;
this.oggetto = o;
this.destinatario = des;
this.operatore = op;
}

public Protocollo() {

}

@XmlElement
public int getNumero() {
return numero;
}

public void setNumero(int numero) {
this.numero = numero;
}

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

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

@XmlElement
public String getOggetto() {
return oggetto;
}

public void setOggetto(String oggetto) {
this.oggetto = oggetto;
}

@XmlElement
public String getDestinatario() {
return destinatario;
}

public void setDestinatario(String destinatario) {
this.destinatario = destinatario;
}

@XmlElement
public String getOperatore() {
return operatore;
}

public void setOperatore(String operatore) {
this.operatore = operatore;
}

}

import java.util.ArrayList;

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

@XmlRootElement(name = "ProtocolloList")
public class ProtocolloList {

@XmlElementWrapper(name = "ProtocolloList")
@XmlElement(name = "protocollo")
private ArrayList<Protocollo> ProtocolloList;

public ArrayList<Protocollo> getProtocolloList() {
return ProtocolloList;
}

public void setProtocolloList(ArrayList<Protocollo> protocolloList) {
ProtocolloList = protocolloList;
}
}

最后我像这样执行转换:

JAXBContext jaxbContext = JAXBContext.newInstance(Protocollo.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(this.resultXML);
protocolli = (ProtocolloList) unmarshaller.unmarshal(reader);

而且我不断收到此异常:

unexpected element (uri:"", local:"ProtocolloList"). Expected elements are <{}protocollo>

我想我在注释方面犯了一些错误。你能帮忙吗?

最佳答案

对于您的用例,您不需要 @XmlElementWrapper 注释。这是因为 ProtocolList 元素对应于您的 @XmlRootElement 注释。然后您需要属性上的 @XmlElement 注释来获取每个列表项。

@XmlRootElement(name = "ProtocolloList")
public class ProtocolloList {

private ArrayList<Protocollo> ProtocolloList;

@XmlElement(name = "protocollo")
public ArrayList<Protocollo> getProtocolloList() {
return ProtocolloList;
}

}

注意:

默认情况下,您应该注释该属性。如果您想注释字段,您应该将 @XmlAccessorType(XmlAccessType.FIELD) 放在您的类中。


更新

您需要确保您的 JAXBContext 知道根类。您可以将 JAXBContext 创建代码更改为以下内容:

JAXBContext jaxbContext = JAXBContext.newInstance(ProtocolloList.class);

关于带有 JAXB 类包装器的 Java Unmarshal 对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24934405/

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