【问题标题】:jaxb mixing XmlElement and XmlValuejaxb 混合 XmlElement 和 XmlValue
【发布时间】:2014-03-13 23:24:51
【问题描述】:

我正在尝试创建一个可以同时包含元素和值的 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 标记的属性并将其生成为设备标记的值?

【问题讨论】:

    标签: xml jaxb


    【解决方案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);
        }
    
    }
    

    相关示例

    【讨论】:

      猜你喜欢
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多