使用JAXB读取xml

时间:2014-10-14 12:04:03

标签: java xml jaxb

我有像这样的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;
    }
}

这是我的记录课。

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

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

2 个答案:

答案 0 :(得分: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的其他替代方案。如果你手动编写类,那就不那么直截了当了。

答案 1 :(得分:0)

JAXBContext

上创建DataSet

您需要在JAXBContext课程上创建DataSet

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

然后,由于DataSet类引用了Record类,因此还会为Record生成元数据。

如果您想在JAXBContext

上创建Record

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