Festlegen von Namespaces und Präfixen in einem Java DOM-Dokument

Ich versuche, ein ResultSet in eine XML-Datei zu konvertieren. Ich habe dieses Beispiel zum ersten Mal für die Serialisierung verwendet.

import  org.w3c.dom.bootstrap.DOMImplementationRegistry;
import  org.w3c.dom.Document;
import  org.w3c.dom.ls.DOMImplementationLS;
import  org.w3c.dom.ls.LSSerializer;

...

DOMImplementationRegistry registry = DOMImplementationRegistry.newInstance();

DOMImplementationLS impl = 
    (DOMImplementationLS)registry.getDOMImplementation("LS");

...     

LSSerializer writer = impl.createLSSerializer();
String str = writer.writeToString(document);

Nachdem ich diese Arbeit gemacht habe, habe ich versucht, meine XML-Datei zu validieren, es gab ein paar Warnungen. Eine davon, keinen Doctype zu haben. Also versuchte ich es auf eine andere Art und Weise. Ich bin auf die Transformer-Klasse gestoßen. In dieser Klasse kann ich die Codierung, den Doctype usw. festlegen.

Die vorherige Implementierung unterstützt die automatische Namespace-Korrektur. Folgendes tut es nicht.

private static Document toDocument(ResultSet rs) throws Exception {   
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    factory.setNamespaceAware(true);
    DocumentBuilder builder = factory.newDocumentBuilder();
    Document doc = builder.newDocument();

    URL namespaceURL = new URL("http://www.w3.org/2001/XMLSchema-instance");
    String namespace = "xmlns:xsi="+namespaceURL.toString();

    Element messages = doc.createElementNS(namespace, "messages");
    doc.appendChild(messages);

    ResultSetMetaData rsmd = rs.getMetaData();
    int colCount = rsmd.getColumnCount();

    String attributeValue = "true";
    String attribute = "xsi:nil";

    rs.beforeFirst();

    while(rs.next()) {
        amountOfRecords = 0;
        Element message = doc.createElement("message");
        messages.appendChild(message);

        for(int i = 1; i <= colCount; i++) {

            Object value = rs.getObject(i);
            String columnName = rsmd.getColumnName(i);

            Element messageNode = doc.createElement(columnName);

            if(value != null) {
                messageNode.appendChild(doc.createTextNode(value.toString()));
            } else {
                messageNode.setAttribute(attribute, attributeValue);
            }
            message.appendChild(messageNode);
        }
        amountOfRecords++;
    }
    logger.info("Amount of records archived: " + amountOfRecords);

    TransformerFactory tff = TransformerFactory.newInstance();
    Transformer tf = tff.newTransformer();
    tf.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
    tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    tf.setOutputProperty(OutputKeys.INDENT, "yes");

    BufferedWriter bf = createFile();
    StreamResult sr = new StreamResult(bf);
    DOMSource source = new DOMSource(doc);
    tf.transform(source, sr);

    return doc;
}

Beim Testen der vorherigen Implementierung wurde eine TransformationException angezeigt: Der Namespace für das Präfix 'xsi' wurde nicht deklariert. Wie Sie sehen, habe ich versucht, dem Stammelement meines Dokuments einen Namespace mit dem Präfix xsi hinzuzufügen. Nachdem ich das getestet hatte, bekam ich immer noch die Ausnahme. Wie werden Namespaces und ihre Präfixe korrekt festgelegt?

Bearbeiten: Ein weiteres Problem, das ich bei der ersten Implementierung habe, ist, dass das letzte Element im XML-Dokument nicht die letzten drei schließenden Tags enthält.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage