我正在尝试用这样的字段来训练课程:
@XmlElement
private Document content;
(JAXB抱怨它无法编组接口,但这不是重点。)
我希望导出content
代表的DOM树并将其插入到结果文档中,所以我最终得到的结果如下:
<stuff>
<myObject>
<content>
(root node of Document value of content field here)
</content>
...
这可能吗?如果可以,怎么做?
提前致谢!
答案 0 :(得分:0)
您可以将字段/属性类型从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;
}
}
<强> input.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