天天看點

通過代碼解壓出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使用。于是仔細檢視學習文檔。

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,就寫到這裡,希望對大家有所幫助。

希望轉載留名,謝謝:)

Tag标簽: SharePoint 2007,MOSS,InfoPath