Установка пространств имен и префиксов в документе Java DOM

Я пытаюсь преобразовать ResultSet в файл XML. Я впервые использовал этот пример для сериализации.

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

После того, как я сделал эту работу, я попытался проверить свой XML-файл, было несколько предупреждений. Один о том, что у вас нет доктайпа Поэтому я попробовал другой способ реализовать это. Я наткнулся на класс Трансформер. Этот класс позволяет мне установить кодировку, тип документа и т. Д.

Предыдущая реализация поддерживает автоматическое исправление пространства имен. Следующего нет.

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

Пока я тестировал предыдущую реализацию, я получил TransformationException: Namespace для префикса 'xsi'; не был объявлен. Как вы можете видеть, я пытался добавить пространство имен с префиксом xsi к корневому элементу моего документа. После тестирования я все еще получил Исключение. Как правильно установить пространства имен и их префиксы?

Изменить: Другая проблема, с которой я столкнулся в первой реализации, заключается в том, что последний элемент в документе XML не имеет последних трех закрывающих тегов.

Ответы на вопрос(3)

Ваш ответ на вопрос