如何将JAXB对象封送到org.w3c.dom.Document?

这给了我一个Document对象,其顶级节点没有子节点:

public static Document getDocument(Object jaxb) { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); //dbf.setNamespaceAware(true); Document doc = dbf.newDocumentBuilder().newDocument(); JAXBContext context = JAXBContext.newInstance(jaxb.getClass()); context.createMarshaller().marshal(jaxb, doc); return doc; } 

这是解决方法,它看起来效率更低,因为它转换为String然后转换为Document。

 public static Document getDocument(Object jaxb) { StringWriter writer = new StringWriter(); JAXBContext context = JAXBContext.newInstance(jaxb.getClass()); context.createMarshaller().marshal(jaxb, writer); return DocumentBuilderFactory.newInstance().newDocumentBuilder(). parse(new InputSource(new StringReader(writer.toString())); } 

是否有可能完成我想要完成的任务?

你在做什么应该工作。 这是一个例子:

领域模型(Foo)

 import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement public class Foo { private String bar; public String getBar() { return bar; } public void setBar(String bar) { this.bar = bar; } } 

演示

 import javax.xml.bind.*; import javax.xml.parsers.*; import javax.xml.transform.*; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.w3c.dom.Document; public class Demo { public static void main(String[] args) throws Exception { // Create the JAXBContext JAXBContext jc = JAXBContext.newInstance(Foo.class); // Create the Object Foo foo = new Foo(); foo.setBar("Hello World"); // Create the Document DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); Document document = db.newDocument(); // Marshal the Object to a Document Marshaller marshaller = jc.createMarshaller(); marshaller.marshal(foo, document); // Output the Document TransformerFactory tf = TransformerFactory.newInstance(); Transformer t = tf.newTransformer(); DOMSource source = new DOMSource(document); StreamResult result = new StreamResult(System.out); t.transform(source, result); } } 

产量

 Hello World 

尝试这个

  DOMResult res = new DOMResult(); JAXBContext context = JAXBContext.newInstance(obj.getClass()); context.createMarshaller().marshal(obj, res); Document doc = (Document) res.getNode();