jaxb混合XmlElement和XmlValue

时间:2014-03-13 23:24:52

标签: xml jaxb

我试图创建一个可以同时包含元素和值的java / jaxb类。

我想在A类列表中读取类的属性,并输出为A类本身的值。

这是XML:

我必须阅读:

<data>
    <device id=”DEV123”>
        <error id=”ERR1”/> 
    </device>
</data>

并生产:

<data>
    <device id="DEV123">ERR1</device>
</data>

这是我的错误类 - 工作正常:

@XmlRootElement(name = "error")
public class Error implements Serializable {
private String id;


@XmlAttribute(name ="id")
public String getId() {

    return id;
}

public void setId(String id ){

    this.id = id;
}

}

我的设备类:

@XmlRootElement(name = "device")
public class Device implements Serializable {


    private String id;
    private String device;
    private ArrayList<Error> errorList;


    @XmlElement
    public ArrayList<Error> getErrorList() {
        return errorList;
    }

    @XmlAttribute(name = "id") 
    public String getId() {

        return id;
    }
    public void setId(String id) {
        this.id = id;
    }

    @XmlValue
    public String getDevice(){
        return this.device;
    }



}

Jaxb抱怨我不能在同一个类中同时拥有xmlelement(Error)和xmlvalue

"If a class has @XmlElement property, it cannot have @XmlValue property."

如何正确建模/注释这个以允许我读取错误xml标记的属性并将其生成为设备标记的值?

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

使用@XmlMixed代替@XmlValue

@XmlMixed
public String getDevice(){
    return this.device;
}

使用StreamFilter删除空格

使用@XmlMixed注释的属性将拾取任何文本字符,无论它是否为空格。如果该属性是一个集合,如果它不是遇到的每一段文本将消灭掉最后一个,它将会收集。因此,您需要在解析时消除空白。

import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Device.class);

        XMLInputFactory xif = XMLInputFactory.newFactory();
        XMLStreamReader xsr = xif.createXMLStreamReader(new StreamSource("src/forum22284324/input.xml"));
        xsr = xif.createFilteredReader(xsr, new StreamFilter() {

            @Override
            public boolean accept(XMLStreamReader reader) {
                if(reader.getEventType() == XMLStreamReader.CHARACTERS) {
                    return reader.getText().trim().length() > 0;
                } 
                return true;
            }

        });

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Root root = (Root) unmarshaller.unmarshal(xsr);
    }

}

相关示例