我正在尝试用这样的字段编码一个类:
@XmlElement
private Document content;
(JAXB 提示它无法编码(marshal)接口(interface),但这不是重点。)
我希望将 content
表示的 DOM 树导入并插入到结果文档中,因此我最终会得到如下结果:
<stuff>
<myObject>
<content>
(root node of Document value of content field here)
</content>
...
这可能吗?如果可能的话,如何实现?
提前致谢!
最佳答案
您可以将字段/属性类型从 Document
更改为 Object
以消除与接口(interface)相关的异常。当 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
关于java - 如何编码节点或文档字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18906595/