您可以将字段/属性类型从更改Document
为Object
以摆脱与接口相关的异常。当 JAXB 不知道要构建什么类型的对象时,它会将其视为 DOM。
领域模型
根
import javax.xml.bind.annotation.*;
@XmlRootElement
public class Root {
private Object content;
public Object getContent() {
return content;
}
public void setContent(Object content) {
this.content = content;
}
}
演示代码
输入.xml
<?xml version="1.0" encoding="UTF-8"?>
<root>
<content>
<dom-1>
<dom-2>
<dom-3/>
</dom-2>
</dom-1>
</content>
</root>
演示
import java.io.File;
import javax.xml.bind.*;
import org.w3c.dom.Element;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Root.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum18906595/input.xml");
Root root = (Root) unmarshaller.unmarshal(xml);
Element element = (Element) root.getContent();
System.out.println(element.getNodeName());
}
}
输出
这里的根元素是属性对应的元素,而不是嵌套文档。
content
更新
以下是您可以利用@XmlElementWrapper
并@XmlAnyElement
获得您正在寻找的行为的一种方式。我过去常常@XmlAccessorType(XmlAccessType.FIELD)
将所有的魔法都保留在该领域,而根本不必改变财产。
根
import java.util.*;
import javax.xml.bind.annotation.*;
@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Root {
@XmlElementWrapper(name="content")
@XmlAnyElement
private List<Object> content;
public Object getContent() {
if(null == content || content.size() == 0) {
return null;
}
return content.get(0);
}
public void setContent(Object content) {
if(null == content) {
this.content = null;
} else {
if(null == this.content) {
this.content = new ArrayList<Object>(1);
}
this.content.set(0, content);
}
}
}
输出
下面是运行相同演示代码的新输出。现在的元素名称是您所期望的。
dom-1