Ich verwende Oracle 11g
Datenbank und jdk1.6.0_45
Ich versuche, eine xml
Datei in Form eines blob
aus der Datenbank und DOM parser
mit zu holen. Ich versuche, das blob
Objekt zu analysieren und den Ausgabeinhalt in der Konsole zu schreiben. Hier ist mein Code snippet-Schreiben BLOB in XML-Datei
String outputFile = "C:\\DEVELOPMENT_PROJECTS\\result1.xml";
String myDocId = "12345";
java.sql.PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM my_document WHERE my_doc_id = '" + myDocID + "'"); // connection is of type java.sql.Connection
java.sql.ResultSet rs = pstmt.executeQuery(); // always returns only one row.
rs.next();
java.sql.Blob blobObj = rs.getBlob("DOC_BLOB");
java.io.InputStream is = blobObj.getBinaryStream();
java.io.FileOutputStream fos = new FileOutputStream(outputFile);
while (((byte) is.read()) != -1) {
fos.write((byte) is.read());
} // tried writing in output xml file too. this writes junk data into the output file
outputFromInputStream(is);
Und hier ist die Ausnahme mit stacktrace-
[email protected]
[Fatal Error] :1:1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:246)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:284)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:124)
at com.dummy.project.lang.DataTest.newDocumentFromInputStream(DataTest.java:197)
at com.dummy.project.lang.DataTest.main(DataTest.java:75)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
ich die Gültigkeit der XML-Datei überprüft haben. Nach der ersten Zeile <?xml version="1.0" encoding="UTF-8" standalone="no"?>
es eine gültige <tag>
Allerdings bin ich erfolgreich in der Lage eine xml
Datei von einem physischen Ort wie C:\
Laufwerk und schreiben Sie es auf den Ausgang xml zu lesen. Dies ist, wie ich es tue, (wenn man bedenkt, dass die InputStream
Abrufen von Daten und die verbleibenden Schritte danach sind häufig) -
java.io.File file = new File("C:\\myLocalXMLFile.xml");
InputStream is = new FileInputStream(file);
outputFromInputStream(is);
Hier ist die gängige Methode Gebraucht-
private void outputFromInputStream(InputStream is) {
javax.xml.parsers.DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
javax.xml.parsers.DocumentBuilder builder = factory.newDocumentBuilder();
org.w3c.dom.Document doc = builder.parse(in); // Exception is thrown here
java.io.StringWriter sw = new StringWriter();
javax.xml.transform.dom.DOMSource domSource = new DOMSource(xmldom);
javax.xml.transform.stream.StreamResult streamResult = new StreamResult(sw);
javax.xml.transform.TransformerFactory tf = TransformerFactory.newInstance();
javax.xml.transform.Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.DOCTYPE_PUBLIC, "yes");
transformer.setOutputProperty("http://xml.apache.org/xslt}indent-amount", "10");
transformer.transform(domSource, streamResult);
System.out.println(sw.toString());
}
Aber ich bin immer noch sehr neugierig zu verstehen, ** warum mein früherer Ansatz nicht funktionierte, wenn ich die Daten aus der Datenbank las, aber gerade wenn ich direkt arbeitete lies es von einem physischen Ort wie C: \ drive **. – AlwaysALearner