Ustawianie przestrzeni nazw i prefiksów w dokumencie Java DOM

Próbuję przekonwertować zestaw wyników do pliku XML. Najpierw użyłem tego przykładu do serializacji.

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);

Po wykonaniu tej pracy próbowałem zweryfikować mój plik XML, było kilka ostrzeżeń. Jeden o braku dokumentu. Spróbowałem tego innego sposobu. Natknąłem się na klasę Transformer. Ta klasa pozwala mi ustawić kodowanie, doctype itp.

Poprzednia implementacja obsługuje automatyczną instalację przestrzeni nazw. Poniższe nie.

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;
}

Podczas testowania poprzedniej implementacji otrzymałem TransformationException: Przestrzeń nazw dla prefiksu „xsi” nie została zadeklarowana. Jak widać, próbowałem dodać przestrzeń nazw z prefiksem xsi do elementu głównego mojego dokumentu. Po przetestowaniu nadal mam wyjątek. Jaki jest właściwy sposób ustawiania przestrzeni nazw i ich prefiksów?

Edycja: Kolejny problem z pierwszą implementacją polega na tym, że ostatni element w dokumencie XML nie ma trzech ostatnich tagów zamykających.

questionAnswers(3)

yourAnswerToTheQuestion