如何将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();