2012-05-18 82 views
0

需要生成XML HTML 報告和相應XSL布提必須使用的MemoryStream,而不是IO文件寫入服務器上的目錄。在大多數情況下,我設法創建一個XML生成XML和HTML從MemoryStream的

MemoryStream ms = new MemoryStream(); 
XmlWriterSettings wSettings = new XmlWriterSettings(); 
wSettings.Indent = true; 
using(XmlWriter writer = XmlWriter.Create(ms,wSettings)) 
{ 
     /** 
      creating xml here 
     **/ 
     writer.Flush(); 
     writer.Close(); 
} 
return ms; // returning the memory stream to another function 
      // to create html 

// This Function creates 
protected string ConvertToHtml(MemoryStream xmlOutput) 
{ 
     XPathDocument document = new XPathDocument(xmlOutput); 
     XmlDocument xDoc = new XmlDocument(); 
     xDoc.Load(xmlOutput); 
     StringWriter writer = new StringWriter(); 
     XslCompiledTransform transform = new XslCompiledTransform(); 
     transform.Load(reportDir + "MyXslFile.xsl"); 
     transform.Transform(xDoc, null, writer); 
     xmlOutput.Position = 1; 
     StreamReader sr = new StreamReader(xmlOutput); 
     return sr.RearToEnd(); 
} 

以及我與創建HTML報告搞亂並不能弄清楚如何將該文件發送到客戶端的線某處。我沒有太多與memorystream合作的經驗。所以,任何幫助將不勝感激。謝謝。

回答

0

你完全繞過你的變換位置:

// This Function creates 
protected string ConvertToHtml(MemoryStream xmlOutput) 
{ 
     XPathDocument document = new XPathDocument(xmlOutput); 
     XmlDocument xDoc = new XmlDocument(); 
     xDoc.Load(xmlOutput); 

     StringWriter writer = new StringWriter(); 
     XslCompiledTransform transform = new XslCompiledTransform(); 
     transform.Load(reportDir + "MyXslFile.xsl"); 
     transform.Transform(xDoc, null, writer); 

     // These lines are the problem 
     //xmlOutput.Position = 1; 
     //StreamReader sr = new StreamReader(xmlOutput); 
     //return sr.RearToEnd(); 

     return writer.ToString() 
} 

而且,打電話給你打電話之前關閉在一個作家是多餘的右對齊的關閉意味着刷新操作。

+0

非常感謝傑米。它似乎writer.ToString()正在生成我所需的html輸出,但我怎麼能夠以一種方式呈現,以便它打開在另一個瀏覽器選項卡作爲另一個html文件。任何想法 ?? – Sanjay

+0

簡單的答案是,你不能從服務器端。您可以通過在HTTP頭中指定Content-Disposition來使瀏覽器顯示文件打開/保存對話框,但實際上會導致出現新的窗口或選項卡,必須使用客戶端代碼完成。有很多種方法可以做到這一點,例如在超鏈接或window.open javascript調用中指定目標屬性。 – JamieSee

+0

在HTTP頭中指定Content-Disposition可以解決我的問題。我試圖** Response.AddHeader(「Content-Disposition」,「attachment; filename =」+ writer.ToString()+「.html」); **但最終我沒有得到一個HTML文件,但一個包含所有html標籤的文件。任何想法 ??謝謝 – Sanjay

0

我不清楚你想實現什麼,但是使用XmlDocument和XPathDocument從相同的內存流加載沒有任何意義。我將MemoryStream設置爲位置0,然後加載它,或者讓函數創建並寫入內存流,以確保它將位置設置爲零,或者在調用XmlDocument上的Load之前或在創建XPathDocument之前執行此操作,取決於你想使用的輸入樹模型。

+0

對不起,我正在嘗試這兩個,因爲一個錯誤彈出說:「根元素丟失。忘了註釋掉。我可以使用任何一個'。在這種情況下,但我使用XmlDocument。 – Sanjay

+0

錯誤」根元素丟失「是由內存流的位置引起的,它位於您寫入它的XML之後的末尾,因此您需要確保在嘗試從其中加載XML之前將流定位在位置0處。 –