Sto provando a convertire un ResultSet in un file XML. Per prima cosa ho usato questo esempio per la serializzazione.Impostazione degli spazi dei nomi e dei prefissi in un documento Java DOM
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);
Dopo aver eseguito questo lavoro, ho provato a convalidare il mio file XML, c'erano un paio di avvertimenti. Uno su non avere un doctype. Così ho provato un altro modo per implementarlo. Mi sono imbattuto nella classe Transformer. Questa classe mi consente di impostare la codifica, il doctype, ecc.
L'implementazione precedente supporta la correzione automatica dello spazio dei nomi. Quanto segue non lo fa.
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;
}
Mentre stavo testando l'attuazione precedente ho ottenuto un TransformationException: Namespace per il prefisso 'XSI' non era stata dichiarata. Come puoi vedere, ho provato ad aggiungere uno spazio dei nomi con il prefisso xsi all'elemento root del mio documento. Dopo aver provato questo ho ancora ottenuto l'eccezione. Qual è il modo corretto per impostare gli spazi dei nomi e i loro prefissi?
Modifica: un altro problema che ho con la prima implementazione è che l'ultimo elemento nel documento XML non ha gli ultimi tre tag di chiusura.
Grazie, funziona ora. Ho imparato qualcosa di nuovo oggi, proprio come ogni giorno. – TrashCan