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);
這裏是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);
下面是常用的方法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());
}
但我仍然很好奇,理解**當我從數據庫中讀取數據時,爲什麼我以前的方法不工作,但直接工作,直接,當我直接從像C:\ drive **這樣的物理位置讀取它。 – AlwaysALearner