我试图创建一个可以同时包含元素和值的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标记的属性并将其生成为设备标记的值?
答案 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);
}
}
相关示例