通過代碼解壓出InfoPath模板文件xsn中的文件

通過代碼解壓出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使用。於是仔細查看學習文檔。
這個東東真的很好,如果有此類需要,推薦大家使用這個組件,代碼編寫很簡單。
我們只需要如下步驟:
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,就寫到這裏,希望對大家有所幫助。

 

希望轉載留名,謝謝:)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章