Próbuję przekonwertować ResultSet na plik XML. Po raz pierwszy użyłem tego przykładu do serializacji.Ustawianie przestrzeni i przedrostków w dokumencie DOM 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);
Po wykonaniu tej pracy, próbowałem sprawdzić poprawność mojego pliku XML, było kilka ostrzeżeń. Jedna o braku typu dokumentu. Spróbowałem więc innego sposobu na wdrożenie tego. Natknąłem się na klasy Transformer. Ta klasa pozwala ustawić kodowanie, typ dokumentu itp.
Poprzednia implementacja obsługuje automatyczne instalowanie 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;
}
Chociaż testował poprzedni realizację Mam TransformationException Przestrzeń nazw dla przedrostka „xsi” nie został uznany. Jak widać, próbowałem dodać przestrzeń nazw z przedrostkiem xsi do głównego elementu mojego dokumentu. Po przetestowaniu tego nadal mam wyjątek. Jaki jest prawidłowy sposób ustawiania przestrzeni nazw i ich prefiksów?
Edytuj: Kolejny problem z pierwszą implementacją polega na tym, że ostatni element w dokumencie XML nie zawiera ostatnich trzech znaczników zamykających.
Dzięki, działa. Nauczyłem się czegoś nowego dzisiaj, tak jak każdego dnia. – TrashCan