通过代码解压出InfoPath模板文件xsn中的文件
2008-05-20 22:04 努力学习的小熊 阅读(5028) 评论(15) 编辑 收藏 举报通过代码解压出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使用。于是仔细查看学习文档。
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文件直接换成InfoPath的xsn模板文件即可,但有个需要注意的地方,这个组件对中文文件名的XSN文件不支持,会报出字符错误信息,所以建议大家使用英文名称的XSN文件,或者使用File类的CopyTo方法复制一个临时的英文名称的模板文件出来,然后对其解压缩,解压缩后再通过File类的Delete方法删除这个文件即可。
然后我们就在指定路径下获得了这个template.xml模板文件,也就是说我们获得了InfoPath表单的数据结构。然后通过这个数据结构就可以对InfoPath作一些分析和操作,例如使用WebPart根据数据结构展现,EventHandler根据数据结构处理数据等等。
OK,就写到这里,希望对大家有所帮助。
希望转载留名,谢谢:)