JAXB - Java/XMLValue和XMLElement冲突

Ada*_* Sh 5 java jaxb

我有下一个html,我要解析:

My input: 
<div>
    <span id="x1x1"> bla bla </span>
</div>
<span>
    <div> bla bla </div>
</span>

My output in java:
    jaxbContext = JAXBContext.newInstance(Div.class);
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
    jaxbUnmarshaller.unmarshal(file);
    System.out.println("id " + div1.getSpan().get(0).get(id) + "value " + div1.getSpan().get(0).get(id))
    // should print: id = x1x1 value = bla bla
Run Code Online (Sandbox Code Playgroud)

我有下一堂课:

public class Span
    List<Div> div;

    public List<Div> getDiv() {
        return div;
    }

    @XmlElement
    public void setDiv(List<Div> div) {
        for (int i = 0 ; i<div.size(); i++){
            System.out.print("element")}
        this.div = div;
    }
Run Code Online (Sandbox Code Playgroud)

和:

public class Div 
    List<Span> span = div1.get

    @XmlElement
    public void setSpan(List<Span> span) {
        for (int i = 0 ; i<span.size(); i++){
            System.out.print("element")}
        this.span = span;
    }

    public List<Button> getSpan() {
        return span;
    }
Run Code Online (Sandbox Code Playgroud)

现在,我也想要跨度的值("bla bla").所以我添加到班级Span:

String value;

public String getValue() {
    return value;
}

@XmlValue
public void setValue(String value) {
    this.value = value;
}
Run Code Online (Sandbox Code Playgroud)

它给了我下一个错误:

 If a class has '@XmlElement' property, it cannot have '@XmlValue' property.
Run Code Online (Sandbox Code Playgroud)

我尝试使用@XMLMixed,但没有成功.我会很高兴举例代码示例.谢谢.

bdo*_*han 8

UPDATE

任何可以同时包含文本和元素的子注释的元素都被认为具有混合内容.在JAXB中,这对应于@XmlMixed注释. @XmlMixed可以在自家的集合属性使用(见原来的答复),或组合@XmlAnyElement,@XmlElementRef@XmlElementRefs.如果元素可以是您将使用的任何元素@XmlAnyElement,如果它是您将使用的一个已知元素,@XmlElementRef并且它是您使用的多个已知元素@XmlElementRefs.

跨度

如果div在同一个span元素中同时存在文本和元素,则可以通过使用@XmlElementRef和注释属性来执行以下操作@XmlMixed.@XmlElementRef注释上指定的元素名称必须直接对应于为目标类指定的根元素.

@XmlRootElement
public class Span {

    List<Object> items = new ArrayList<Object>();

    @XmlMixed
    @XmlElementRef(type=Div.class, name="div")
    public List<Object> getItems() {
        return items;
    }

    public void setItems(List<Object> mixed) {
        this.items = items;
    }


}
Run Code Online (Sandbox Code Playgroud)

DIV

元数据Div几乎与指定的元数据相同Span.

@XmlRootElement
public class Div {

    List<Object> items = new ArrayList<Object>();

    @XmlElementRef(name="span", type=Span.class)
    @XmlMixed
    public List<Object> getItems() {
        return items;
    }

    public void setItems(List<Object> items) {
        this.items = items;
    }

}
Run Code Online (Sandbox Code Playgroud)

演示

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Span.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Span span = (Span) unmarshaller.unmarshal(new StringReader("<span>Text<div>Text2</div>Text3</span>"));
        System.out.println(span.getItems());

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(span, System.out);
    }

}
Run Code Online (Sandbox Code Playgroud)

产量

[Text, forum15495156.Div@289f6ae, Text3]
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<span>Text<div>Text2</div>Text3</span>
Run Code Online (Sandbox Code Playgroud)

原始答案

您可以将添加了List<String>注释的属性添加@XmlMixed到您的Span类中:

跨度

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
public class Span {
    List<Div> div;
    List<String> mixed;

    @XmlMixed
    public List<String> getMixed() {
        return mixed;
    }

    public void setMixed(List<String> mixed) {
        this.mixed = mixed;
    }

    public List<Div> getDiv() {
        return div;
    }

    @XmlElement
    public void setDiv(List<Div> div) {
        for (int i = 0; i < div.size(); i++) {
            System.out.print("element");
        }
        this.div = div;
    }
}
Run Code Online (Sandbox Code Playgroud)

演示

import java.io.StringReader;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Span.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Span span1 = (Span) unmarshaller.unmarshal(new StringReader("<span>bla bla bla</span>"));
        System.out.println(span1.getMixed());

        Span span2 = (Span) unmarshaller.unmarshal(new StringReader("<span><div/><div/></span>"));
        System.out.println(span2.getDiv());
    }

}
Run Code Online (Sandbox Code Playgroud)

产量

[bla bla bla]
elementelement[forum15495156.Div@1f80ce47, forum15495156.Div@4166a779]
Run Code Online (Sandbox Code Playgroud)