Das gibt mir ein Dokument-Objekt mit einem Top-Level-Knoten ohne Kindknoten:wie ein JAXB-Objekt zu org.w3c.dom.Document marshalieren?
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;
}
Dies ist die Abhilfe, die noch ineffizient scheint, da es zu String konvertiert und dann auf dem Dokument.
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()));
}
Ist es möglich zu erreichen, was ich versuche zu erreichen?
Es stellte sich heraus, dass das Problem nicht von JAXB zu dokumentieren. Das Problem bestand darin, dass Namespace-agnostische XPath-Abfragen aus irgendeinem Grund nicht mit dem Document-Objekt funktionieren, das von der ersten Methode zurückgegeben wurde, sondern mit dem Document-Objekt funktionieren, das von der zweiten Methode zurückgegeben wurde. Die Lösung - zumindest für jetzt - besteht darin, meine Xpath-Abfragen neu zu schreiben. –
Als späte Anmerkung: Der Grund, warum Namespace-Agnostic XPath-Abfragen funktionieren, wenn Sie Ihre gemarshallt Daten analysieren, liegt daran, dass Dokument-Builder standardmäßig kein Namespace kennen. Wenn JAXB das DOM erstellt, sind die DocumentBuilder-Einstellungen nicht relevant, da kein Parsing beteiligt ist. – Michael