2012-05-18 52 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处。 –