Discussions
Categories
- 197.1K All Categories
- 2.5K Data
- 546 Big Data Appliance
- 1.9K Data Science
- 450.7K Databases
- 221.9K General Database Discussions
- 3.8K Java and JavaScript in the Database
- 31 Multilingual Engine
- 552 MySQL Community Space
- 479 NoSQL Database
- 7.9K Oracle Database Express Edition (XE)
- 3.1K ORDS, SODA & JSON in the Database
- 555 SQLcl
- 4K SQL Developer Data Modeler
- 187.2K SQL & PL/SQL
- 21.3K SQL Developer
- 296.3K Development
- 17 Developer Projects
- 139 Programming Languages
- 293K Development Tools
- 110 DevOps
- 3.1K QA/Testing
- 646.1K Java
- 28 Java Learning Subscription
- 37K Database Connectivity
- 158 Java Community Process
- 105 Java 25
- 22.1K Java APIs
- 138.2K Java Development Tools
- 165.3K Java EE (Java Enterprise Edition)
- 19 Java Essentials
- 162 Java 8 Questions
- 86K Java Programming
- 81 Java Puzzle Ball
- 65.1K New To Java
- 1.7K Training / Learning / Certification
- 13.8K Java HotSpot Virtual Machine
- 94.3K Java SE
- 13.8K Java Security
- 204 Java User Groups
- 24 JavaScript - Nashorn
- Programs
- 466 LiveLabs
- 39 Workshops
- 10.2K Software
- 6.7K Berkeley DB Family
- 3.5K JHeadstart
- 5.7K Other Languages
- 2.3K Chinese
- 175 Deutsche Oracle Community
- 1.1K Español
- 1.9K Japanese
- 233 Portuguese
Writing BLOB into XML file

I am using `Oracle 11g` database and `jdk1.6.0_45`
I am attempting to fetch an `xml` file in the form of a `blob` from the database and using `DOM parser`. I'm trying to parse the `blob` object and write the output content in the console. Here is my code snippet-
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);
And here is the Exception with stacktrace-
[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"?>
I've checked the validity of the XML file. After the first line `<?xml version="1.0" encoding="UTF-8" standalone="no"?>` there is a valid `<tag>`
However, I'm successfully able to read an `xml` file from a physical location like `C:\` drive and write it to the output xml. This is how I'm doing it (keeping in mind that fetching the `InputStream` data and remaining steps after that are common) -
java.io.File file = new File("C:\\myLocalXMLFile.xml");
InputStream is = new FileInputStream(file);
outputFromInputStream(is);
Here is the common method used-
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());
}
Answers
-
For some reason, the following code snippet worked-
<span class="typ">BufferedReader</span><span class="pln"> br </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">BufferedReader</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">InputStreamReader</span><span class="pun">(</span><span class="pln">is</span><span class="pun">));</span><span class="pln"><br/></span><span class="typ">StringBuilder</span><span class="pln"> sb </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StringBuilder</span><span class="pun">();</span><span class="pln"><br/></span><span class="typ">String</span><span class="pln"> line </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">;</span><span class="pln"><br/></span><span class="kwd">while</span><span class="pln"> </span><span class="pun">((</span><span class="pln">line </span><span class="pun">=</span><span class="pln"> br</span><span class="pun">.</span><span class="pln">readLine</span><span class="pun">())</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> </span><span class="kwd">null</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln"><br/> sb</span><span class="pun">.</span><span class="pln">append</span><span class="pun">(</span><span class="pln">line</span><span class="pun">);</span><span class="pln"><br/></span><span class="pun">}</span><span class="pln"><br/></span><span class="typ">System</span><span class="pun">.</span><span class="pln">out</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">sb</span><span class="pun">.</span><span class="pln">toString</span><span class="pun">());</span>
But I'm still very curious to understand why my previous approach didn't work when I was reading the data from the database, but worked just fine when I directly read it from a physical location like C:\ drive.