[英]Jackson XML marshal error when XmlAttribute and XmlElement have the same name
Jackson XML 似乎無法編組具有特定屬性的標記的 XML,該屬性的名稱也用於嵌套的子標記(“occ”,在以下情況下)。
<root>
<txt occ="1">
<occ id="1">first element</occ>
<occ id="2">second element</occ>
</txt>
<txt occ="2">
<occ id="1">first element</occ>
<occ id="2">second element</occ>
</txt>
</root>
更改 XmlAttribute "occ" 或 XmlElement "occ" 的名稱使其工作。
這是我注釋我的 Txt 類的方式:
@XmlAccessorType(XmlAccessType.FIELD)
public class Txt {
@XmlAttribute(name="occ")
private String occ_attr;
@XmlElement(name="occ")
private List<Occ> occ = new ArrayList<Occ>();
//getters and setters not annotated
這就是我注釋 Occ 類的方式:
public class Occ {
@XmlAttribute
private String id;
@XmlValue
private String value;
//getters and setters not annotated
我將它們包裹在一個根中,並且有效。
考試班
import java.io.StringReader;
import javax.xml.bind.*;
public class Test {
public static void main(String...args) throws JAXBException {
String text = "<root>\n" +
" <txt occ=\"1\">\n" +
" <occ id=\"1\">first element</occ>\n" +
" <occ id=\"2\">second element</occ>\n" +
" </txt>\n" +
" <txt occ=\"2\">\n" +
" <occ id=\"1\">first element</occ>\n" +
" <occ id=\"2\">second element</occ>\n" +
" </txt>\n" +
"</root>";
JAXBContext jaxbContext = JAXBContext.newInstance(Root.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
StringReader reader = new StringReader(text);
Root root = (Root) unmarshaller.unmarshal(reader);
System.out.println(root);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
StringWriter sw = new StringWriter();
jaxbMarshaller.marshal(root, sw);
String xmlContent = sw.toString();
System.out.println(xmlContent);
}
}
TXT類
import java.util.List;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class Txt {
@XmlAttribute(name = "occ")
private String occ_attr;
@XmlElement(name = "occ")
private ArrayList<Occ> occ;
public String getOcc_attr() {
return occ_attr;
}
public void setOcc_attr(String occ_attr) {
this.occ_attr = occ_attr;
}
public List<Occ> getOcc() {
return occ;
}
public void setOcc(ArrayList<Occ> occ) {
this.occ = occ;
}
@Override
public String toString() {
return "Txt [occ_attr=" + occ_attr + ", occ=" + occ + "]";
}
}
上課
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
public class Occ {
@XmlAttribute
private String id;
@XmlValue
private String value;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return "Occ [id=" + id + ", value=" + value + "]";
}
}
根類
import java.util.ArrayList;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "root")
public class Root {
@XmlElement(name = "txt")
private ArrayList<Txt> txt;
@Override
public String toString() {
return "Root [txt=" + txt + "]";
}
}
打印出來:
Root [txt=[Txt [occ_attr=1, occ=[Occ [id=1, value=first element], Occ [id=2, value=second element]]], Txt [occ_attr=2, occ=[Occ [id=1, value=first element], Occ [id=2, value=second element]]]]]
<root>
<txt occ="1">
<occ id="1">first element</occ>
<occ id="2">second element</occ>
</txt>
<txt occ="2">
<occ id="1">first element</occ>
<occ id="2">second element</occ>
</txt>
</root>
顯然這是圖書館的問題。 到今天為止,這個問題還沒有解決:
https://github.com/FasterXML/jackson-dataformat-xml/issues/65
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.