2017-01-03 15 views
0

Я использую Oracle 11g базы данных и jdk1.6.0_45 Я пытаюсь принести в xml файл в виде blob из базы данных и с использованием DOM parser. Я пытаюсь разобрать объект blob и написать выходной контент в консоли. Вот мой код snippet-Запись BLOB в XML файл

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

А вот Exception с 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"?> 

Я проверил правильность файла XML. После первой линии <?xml version="1.0" encoding="UTF-8" standalone="no"?> есть действительный <tag>

Однако, я успешно смог прочитать xml файл из физического расположения, как C:\ привод и записать его в выходной XML. Вот как я это делаю (имея в виду, что выборка данных InputStream и оставшиеся шаги после этого обычны) -

java.io.File file = new File("C:\\myLocalXMLFile.xml"); 

InputStream is = new FileInputStream(file); 
outputFromInputStream(is); 

Вот общий метод используется-

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

ответ

0

По какой-то причине , следующий рабочий фрагмент кода:

BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
StringBuilder sb = new StringBuilder(); 
String line = null; 
while ((line = br.readLine()) != null) { 
    sb.append(line); 
} 
System.out.println(sb.toString()); 
+0

Но мне все еще очень любопытно понять, почему мой предыдущий подход не работал, когда я читал данные из базы данных, но работал отлично, когда я прямо прочитайте его из физического местоположения, такого как C: \ drive **. – AlwaysALearner