代码改变世界

通过代码解压出InfoPath模板文件xsn中的文件

2008-05-20 22:04  努力学习的小熊  阅读(4997)  评论(15编辑  收藏  举报
 

通过代码解压出InfoPath模板文件xsn中的文件

经过一天的搜索,发现InfoPath的模板文件是一个后缀为xsn的文件,其实他是一个cab文件,大家可以试试,将他的后缀修改为cab或者zip,都可以解压出来文件。但是我们如何通过代码的方式来解压出其中的文件呢?在SharePoint中的表单库,我们不能等用户上传表单文件后再进行数据结构的分析,所以我们要从InfoPath的模板文件下手,最先想到的就是操作表单库的模板文件,也就是InfoPath的模板文件,这里语义有些歧异。InfoPath设计后的后缀名为xsn文件是InfoPath的模板文件,而在SharePoint表单库中的InfoPath模板文件确是一个后缀为xmlInfoPath模板文件。后者就是我们需要进行分析的文件。用记事本打开它我们会发现它是一个标准的XML文件,但是确比一般的XML文件多出了一些描述内容:

<?mso-infoPathSolution name="urn:schemas-microsoft-com:office:infopath:XmUJ-i-Jk1RQ77--5e---:-myXSD-2008-05-09T02-41-53" href="manifest.xsf" solutionVersion="1.0.0.6" productVersion="12.0.0" PIVersion="1.0.0.0" ?>

<?mso-application progid="InfoPath.Document" versionProgid="InfoPath.Document.2"?>

这两行描述的作用就是指出这是一个InfoPath的表单模板,保存xml文件后,如果机器上安装了InfoPath(我的环境是InfoPath 2007),那么这个xml文件的图标就会发生改变,变成可由InfoPath打开的一个文件,我们双击后就会以InfoPath来打开这个文件。这里不再多说,不是我们的主题。

于是我想做的更好一些,在管理员发布表单模板xsn文件后,直接操作这个xsn文件。由于它就是个cab压缩包,我将其进行了解压。发现了其中具有六个文件:

manifest.xsf

myschema.xsd

sampledata.xml

template.xml

upgrade.xsl

view1.xsl

哈,发现了我们需要的tempalte.xml文件。其他文件也各有用处,此处不需关心他们。那么我们只要实现了解压xsn文件,那么就能获得这个模板文件来对InfoPath表单的数据结构进行分析了。

刚开始,westart同学给我提供了微软解决方案包中的InfoPath操作函数,这里也共享给大家,如下:

public bool f_ExternXsn(string InputFile, string OutputDirecty)

{

    try

    {

        string serverMap = Server.MapPath("");

        FileInfo fi = new FileInfo(InputFile);

        DirectoryInfo di = new DirectoryInfo(OutputDirecty);

        System.Diagnostics.Process process1 = new System.Diagnostics.Process();

        process1.StartInfo.Arguments = @"/y /e " + fi.FullName + @" /l " + di.FullName;

        process1.StartInfo.FileName = serverMap + @"\extract.exe ";

        process1.Start();

        //等待解压

        while (!process1.HasExited)

        { }

        process1.Close();

        return true;

    }

    catch (System.Exception err)

    {

        Response.Write("<script>alert(\"解压失败!错误原因:" + err.Message + "\")</script>");

        return false;

    }

}

其中:

需要添加一个组件

Microsoft.Office.InfoPath.Server.dll

需要引用两个命名空间

using Microsoft.Office.InfoPath.Server;

using Microsoft.Office.InfoPath.Server.Controls;

例子中是通过一个Windows自带的工具extract.exe来实现,但这并不是我想要的方法。我想通过.NET的方式来实现。但是这个方法也能实现,只是我将这个函数改在ConsoleApplication下使用,但是我改后并没有真正做成功T_T,不知原因何在,粗略看了CABSDK也没找出个所以然。所以放弃了这个方法,去尝试其他的方法。

期间又得到了十一同学的大力支持,提供给我一些实验的LAB,但是好像里面有压缩的方法,没有提到解压的方法,于是,又未果。

最后,我突然想到,既然这个xsn文件就是一个cab文件,那么为什么我要搜索xsn文件的解压缩呢,唉……笨啊……之前搜索xsn的解压资料相当的少啊,于是改搜索cab 的解压缩,厚厚~~~被我找到了吧。

ElmueCodeProject上发布了一个CAB的解压缩组件,是用C++编写的,被作者包装为同时支持C++.NET使用。于是仔细查看学习文档。

Cabinet File (*.CAB) Compression and Extraction

这个东东真的很好,如果有此类需要,推荐大家使用这个组件,代码编写很简单。

我们只需要如下步骤:

1.添加CabLib.dll组件的引用。

2.实例化解压类。

CabLib.Extract i_Extract = new CabLib.Extract();

3.解压我们需要的文件。

i_Extract.ExtractFile(@"C:\Temp\Packed.cab", @"E:\ExtractFolder");

三步就实现了一个CAB文件的解压缩。

 

这里我做过实验了,我们只需要把里面的CAB文件直接换成InfoPathxsn模板文件即可,但有个需要注意的地方,这个组件对中文文件名的XSN文件不支持,会报出字符错误信息,所以建议大家使用英文名称的XSN文件,或者使用File类的CopyTo方法复制一个临时的英文名称的模板文件出来,然后对其解压缩,解压缩后再通过File类的Delete方法删除这个文件即可。

然后我们就在指定路径下获得了这个template.xml模板文件,也就是说我们获得了InfoPath表单的数据结构。然后通过这个数据结构就可以对InfoPath作一些分析和操作,例如使用WebPart根据数据结构展现,EventHandler根据数据结构处理数据等等。

OK,就写到这里,希望对大家有所帮助。

 

希望转载留名,谢谢:)