论坛首页 入门技术论坛

使用db2 9x实现包含二进制文件内容的xml文档的存储和检索

浏览 1968 次
该帖已经被评为新手帖
作者 正文
   发表时间:2008-05-15   最后修改:2009-03-23
使用db29.x XML类型实现二进制数据的存储与检索

存储
Xml文档可以用<[!CDATA[]]>在文档内部来包含一些二进制方式的内容,如:可执行文件、pdf文档等等。
Db2 9x提供了对xml直接存储的支持,那么怎么样将二进制文件的内容写入到xml文档,并将文档保存到db2 数据库中呢?
实验的过程如下:
在db2中建一张包含xml字段的表,只包含2个字段,a,b,其中b为xml类型的字段;
使用如下的代码实现二进制xml文件的存储:
public static void insert(Connection cnn) throws Exception{
PreparedStatement preparedStatement =
cnn.prepareStatement("INSERT INTO admin.test VALUES(1,?)");
preparedStatement.setInt(1, 1);
String xml="<root><![CDATA[";//可以在xml文档中增加一些描述性的元素来说明二进制文件的摘要信息
//以下读取文件内容
StringBuffer m_cStrXML= new StringBuffer();
File cFileBinary = new File("c:\\\\test.chm");

int fSize = new Long(cFileBinary.length()).intValue();
byte[] fContent = new byte[fSize];
   
FileInputStream fis = new FileInputStream(cFileBinary);
int bRead;
String cStrByte=null;
if((bRead=fis.read(fContent,0,fSize))!=-1)
{
//非常关键的一步,将二进制编码
    m_cStrXML.append(new String(new Base64().encode(fContent)));
}
xml+=m_cStrXML.toString();
xml+="]]></root>";
preparedStatement.setString(1, xml);
int n = preparedStatement.executeUpdate();
cnn.commit();
}
检索
前面步骤完成了包含二进制内容的xml文档的存储,通过db2提供的xquery语法,可以对这个xml表的内容进行方便的检索,那么查到需要的文件后,怎么将二进制内容重新转换成合适的文件呢?
以下的代码假设已经知道了二进制文件的格式为chm文件,在实际的应用中,可以通过在xml文档中增加其他的摘要信息来描述二进制数据,比如:文件的格式、打开文件的格式,可以与DTD、Schema等XML工具来实现更强的功能。
恢复二进制文件的代码如下:
public static void read(Connection cnn) throws Exception{
//xs:string必须加上,否则返回的xml文档会包含xml Tag
PreparedStatement preparedStatement =
cnn.prepareStatement("select xmlquery('xs:string($xx/root)' passing b as \"xx\") from admin.test");
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
String xml = resultSet.getString(1);
//Base64解码
Base64 bs = new Base64();
byte[] bt = bs.decode(xml);
//以下输出到文件,假定文件为chm格式
File fileOutput = new File("C:\\\\test1.chm");
FileOutputStream fo = new FileOutputStream(fileOutput);
fo.write(bt);
fo.close();
System.out.println("chm retrieved");
}
}
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics