questo mi dà un oggetto Document con un nodo di primo livello senza nodi figli:come eseguire il marshalling di un oggetto JAXB su org.w3c.dom.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;
}
Questa è la soluzione, che sembra ancora più inefficiente, dal momento che converte in stringa e poi al documento.
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()));
}
È possibile realizzare ciò che sto cercando di realizzare?
scopre che il problema era non eseguire il marshalling da JAXB per documentare. Il problema era che, per qualche ragione, le query XPath agnostiche dei namespace non funzionano con l'oggetto Document restituito dal primo metodo, ma funzionano bene con l'oggetto Document restituito dal secondo metodo. La soluzione - almeno per ora - è di riscrivere le mie query Xpath. –
Come commento in ritardo: il motivo per cui le query XPath agnostiche dei namespace funzionano se si analizzano i dati sottoposti a marshalling perché i builder di documenti non sono per impostazione predefinita sullo spazio dei nomi. Quando JAXB crea il DOM, le impostazioni di DocumentBuilder non sono rilevanti perché non sono coinvolte le analisi. – Michael