【问题标题】:Reading xml with JAXB使用 JAXB 读取 xml
【发布时间】:2014-10-14 12:04:03
【问题描述】:

我有一个这样的 XML

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<data-set>
    <record>
        <TARIH>data</TARIH>
        <GUNLER>data</GUNLER>
        <YEMEK1>data</YEMEK1>
        <YEMEK2>data</YEMEK2>       
    </record>
    <record>
        <TARIH>data</TARIH>
        <GUNLER>data</GUNLER>
        <YEMEK1>data</YEMEK1>
        <YEMEK2>data</YEMEK2>   
    </record>
</data-set>

我想用 Java 中的 JAXB 解析它。这是我的 DataSet 类。

@XmlRootElement(name="data-set")
@XmlAccessorType(XmlAccessType.FIELD)
public class DataSet {
    @XmlElement(name="record")
    private List<Record> records = null;
    public List<Record> getRecords(){
        return records;
    }

    public void setRecords(List<Record> records){
        this.records = records;
    }
}

这是我的 Record 类。

@XmlRootElement(name="record")
@XmlAccessorType(XmlAccessType.FIELD)
public class Record {
    String TARIH,GUNLER,YEMEK1,ANAYEMEK1,ANAYEMEK2,YEMEK3,YEMEK4,SALATBAR1,SALATBAR2,SALATBAR3,SALATBAR4,SALATBAR5;

    //getters and setters//

我尝试了类似的方法。

public class Main {
    public static void main(String[] args) throws JAXBException {
        File file = new File("C:/Users/EMRE/Desktop/YEMEKHANE DATABASE/morning.xml");
        JAXBContext jaxbcontext = JAXBContext.newInstance(Record.class);
        Unmarshaller jaxbunmarshaller = jaxbcontext.createUnmarshaller();
        Record record = (Record)jaxbunmarshaller.unmarshal(file);

        System.out.println(record.getTARIH());
    }
}   

我遇到了这样的错误。

Exception in thread "main" javax.xml.bind.UnmarshalException: unexpected element (uri:"", local:"data-set"). Expected elements are <{}record>

我该如何解决这个问题?谢谢。

【问题讨论】:

    标签: java xml jaxb


    【解决方案1】:

    使用DataSet 类创建您的上下文。

    JAXBContext jaxbcontext = JAXBContext.newInstance(DataSet.class);
    

    也许您还需要添加Record(不确定):

    @XmlSeeAlso({Record.class})
    public class DataSet {...}
    

    但我认为即使没有它也可以工作。

    或者你可以这样做:

    JAXBContext jaxbcontext = JAXBContext.newInstance(DataSet.class, Record.class);
    

    还有基于包名的context path 的其他替代方案。如果您手动编写类,那就不是那么简单了。

    【讨论】:

      【解决方案2】:

      DataSet 上创建JAXBContext

      您需要在 DataSet 类上创建您的 JAXBContext

          JAXBContext jaxbcontext = JAXBContext.newInstance(DataSet.class);
      

      那么由于DataSet 类引用Record 类,也会为Record 生成元数据。

      如果你想在Record 上创建JAXBContext

      在您的问题中,您在Record 上创建了JAXBContext,因为记录没有引用DataSet,因此没有为其创建元数据。如果您仍想在Record 上创建JAXBContext,您可以在Record 上添加类型级别的@XmlSeeAlso 注释以拉入DataSet 类。

      【讨论】:

      • 非常感谢。这是我的错误,但你救了我的命。
      • 嗯... SO 是否提供英雄主义徽章?
      猜你喜欢
      • 1970-01-01
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      相关资源
      最近更新 更多