Ich versuche, ein ResultSet in eine XML-Datei zu konvertieren. Ich habe dieses Beispiel zuerst für die Serialisierung verwendet.Festlegen von Namespaces und Präfixen in einem Java-DOM-Dokument
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 ich versucht, meine XML-Datei zu überprüfen, gibt es ein paar Warnungen waren. Eine über keinen Doctype. Also habe ich einen anderen Weg versucht, dies zu implementieren. Ich bin auf die Transformer-Klasse gestoßen. Mit dieser Klasse kann ich die Codierung, den Doctyp usw. festlegen.
Die vorherige Implementierung unterstützt die automatische Namensraumkorrektur. Das Folgende 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;
}
Während ich die vorherige Implementierung ich eine TransformationException bekam Prüfung wurde: Namensraum für Vorsilbe ‚xsi‘ erklärt worden ist. Wie Sie sehen können, habe ich versucht, dem Wurzelelement meines Dokuments einen Namespace mit dem Präfix xsi hinzuzufügen. Nach dem Testen habe ich immer noch die Ausnahme. Wie werden Namespaces und ihre Präfixe richtig festgelegt?
Bearbeiten: Ein weiteres Problem, das ich mit der ersten Implementierung habe, ist, dass das letzte Element im XML-Dokument nicht die letzten drei schließenden Tags hat.
Danke, es funktioniert jetzt. Heute, wie jeden Tag, etwas Neues gelernt. – TrashCan