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

经过代码解压出 InfoPath 模板文件 xsn 中的文件
通过一天的搜索,发现 InfoPath 的模板文件是一个后缀为 xsn 的文件,其实他是一个 cab 文件,你们能够试试,将他的后缀修改成 cab 或者 zip ,均可以解压出来文件。可是咱们如何经过代码的方式来解压出其中的文件呢?在 SharePoint 中的表单库,咱们不能等用户上传表单文件后再进行数据结构的分析,因此咱们要从 InfoPath 的模板文件下手,最早想到的就是操做表单库的模板文件,也就是 InfoPath 的模板文件,这里语义有些歧异。 InfoPath 设计后的后缀名为 xsn 文件是 InfoPath 的模板文件,而在 SharePoint 表单库中的 InfoPath 模板文件确是一个后缀为 xml InfoPath 模板文件。后者就是咱们须要进行分析的文件。用记事本打开它咱们会发现它是一个标准的 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 ,不知缘由何在,粗略看了 CAB SDK 也没找出个因此然。因此放弃了这个方法,去尝试其余的方法。
期间又获得了十一同窗的大力支持,提供给我一些实验的 LAB ,可是好像里面有压缩的方法,没有提到解压的方法,因而,又未果。
最后,我忽然想到,既然这个 xsn 文件就是一个 cab 文件,那么为何我要搜索 xsn 文件的解压缩呢,唉……笨啊……以前搜索 xsn 的解压资料至关的少啊,因而改搜索 cab 的解压缩,厚厚 ~~~ 被我找到了吧。
Elmue CodeProject 上发布了一个 CAB 的解压缩组件,是用 C++ 编写的,被做者包装为同时支持 C++ .NET 使用。因而仔细查看学习文档。
这个东东真的很好,若是有此类须要,推荐你们使用这个组件,代码编写很简单。
咱们只须要以下步骤:
1 .添加 CabLib.dll 组件的引用。
2 .实例化解压类。
CabLib.Extract i_Extract = new CabLib.Extract();
3 .解压咱们须要的文件。
i_Extract.ExtractFile(@"C:\Temp\Packed.cab", @"E:\ExtractFolder");
三步就实现了一个 CAB 文件的解压缩。
 
这里我作过实验了,咱们只须要把里面的 CAB 文件直接换成 InfoPath xsn 模板文件便可,但有个须要注意的地方,这个组件对中文文件名的 XSN 文件不支持,会报出字符错误信息,因此建议你们使用英文名称的 XSN 文件,或者使用 File 类的 CopyTo 方法复制一个临时的英文名称的模板文件出来,而后对其解压缩,解压缩后再经过 File 类的 Delete 方法删除这个文件便可。
而后咱们就在指定路径下得到了这个 template.xml 模板文件,也就是说咱们得到了 InfoPath 表单的数据结构。而后经过这个数据结构就能够对 InfoPath 做一些分析和操做,例如使用 WebPart 根据数据结构展示, EventHandler 根据数据结构处理数据等等。
OK ,就写到这里,但愿对你们有所帮助。
 
但愿转载留名,谢谢:)
相关文章
相关标签/搜索