2017-01-03 4 views
0

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

Antwort

0

Aus irgendeinem Grund , der folgende Code-Ausschnitt funktionierte:

+0

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