Java使用JAXB解析带类包装器的对象列表

4

通过BaseX服务器执行的XQuery,我获得了以下结果:

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

我需要使用JAXB将此结果转换为Protocollo对象列表,以便可以使用JList显示它们。因此,遵循以下讨论(链接),我声明了以下类:

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;
  }

}

and

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>

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


1
这与Swing有什么关系? - Andrew Thompson
1个回答

9

对于你的使用情况,你不需要使用@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初始化程序中做错了什么...应该是像这样的吧? "JAXBContext jc = JAXBContext.newInstance(ProtocolloList.class, Protocollo.class);" - SagittariusA
1
@LoryLory - 是的,你应该在 ProtocolloList 类上创建 JAXBContext - bdoughan
1
谢谢,那确实是错误。你真好啊! :) - SagittariusA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接