簡體   English   中英

當 XmlAttribute 和 XmlElement 具有相同名稱時,Jackson XML 編組錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM