缺少XmlElement

时间:2016-06-01 12:55:28

标签: java xml jaxb

我应该读取输入XML中的Turn元素的每个值:

<Section type="report" startTime="0" endTime="182.952">
        <Turn speaker="spk1" startTime="7.186" endTime="8.114">
            <Sync time="7.186"/>un souci avec une inscription
        </Turn>
        <Turn speaker="spk2" startTime="8.114" endTime="8.533">
            <Sync time="8.114"/>ouais
        </Turn>
        <Turn speaker="spk1 spk2" startTime="8.533" endTime="9.731">
            <Sync time="8.533"/>
            <Who nb="1"/>first value!
            <Who nb="2"/>second value!
        </Turn>
</Section> 

所以我使用了JAXB并制作了以下类:

部分:

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

private List<Turn> turn;

@XmlElement(name="Turn")
public List<Turn> getTurn() {
    if(turn == null){
        turn = new ArrayList<Turn>();
    }
    return turn;
}

public void setTurn(List<Turn> turn) {
    this.turn = turn;
}
}

转到:

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

private String speaker;
private float startTime;
private float endTime;
private Sync sync;
private String content;
private List<Who> whoList;

@XmlAttribute
public String getSpeaker() {
    return speaker;
}
public void setSpeaker(String speaker) {
    this.speaker = speaker;
}
public float getStartTime() {
    return startTime;
}

@XmlAttribute
public void setStartTime(float startTime) {
    this.startTime = startTime;
}

@XmlAttribute
public float getEndTime() {
    return endTime;
}
public void setEndTime(float endTime) {
    this.endTime = endTime;
}

@XmlValue
public String getContent() {
    return content;
}
public void setContent(String content) {
    this.content = content;
}
}

但是当我想要读取例如Turn的值,其中扬声器等于“spk1 spk2”时,Turn的方法getContent仅返回“第二个值!”..我怎样才能获得所有内容值!” ? 我知道不允许为一个Element设置带有XmlValue的XmlElement,但是我别无选择,xml文件是这样的,我应该使用这样的许多文件..

提前致谢:)

2 个答案:

答案 0 :(得分:0)

我认为你的问题来自你@XmlElement(name="Turn")的声明。如果您查看以下tutorial from Vogella,由于注释XmlElementWrapper,您将看到他正在为其列表使用包装器,并在列表的声明处设置注释,而不是在方法之前,如下:

  

// XmLElementWrapper围绕XML表示生成包装元素    @XmlElementWrapper(name =“bookList”)

     

// XmlElement设置实体的名称    @XmlElement(name =“book”)    private ArrayList bookList;

在您的情况下,我认为JAXB在您希望它处理对象列表时管理对象。

答案 1 :(得分:0)

所以你要处理混合内容。请查看其他问题how-to-deal-with-jaxb-complextype-with-mixedcontent-datajaxb-xmlmixed-usage-for-reading-xmlvalue-and-xmlelement。使用@XmlMixed类的注释Turn可以进行管理。然后,我不太确定你是否需要内容的getter和setter方法。