經過代碼解壓出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 ,就寫到這裏,但願對你們有所幫助。
 
但願轉載留名,謝謝:)
相關文章
相關標籤/搜索