首页 文章

jaxb混合XmlElement和XmlValue

提问于
浏览
1

我正在尝试创建一个可以同时包含元素和值的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 回答

  • 1

    您可以执行以下操作:

    使用@XmlMixed而不是@XmlValue

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

    使用StreamFilter删除空格

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

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

    Related Example

相关问题