C# 从MemoryStream生成XML和HTML

C# 从MemoryStream生成XML和HTML,c#,asp.net,html,xml,xslt,C#,Asp.net,Html,Xml,Xslt,需要从XML和相应的XSL生成html报告,但我必须在服务器目录上使用memorystream而不是IO文件写入。在很大程度上,我创建了一个xml MemoryStream ms = new MemoryStream(); XmlWriterSettings wSettings = new XmlWriterSettings(); wSettings.Indent = true; using(XmlWriter writer = XmlWriter.Create(ms,wSettings)) {

需要从XML和相应的XSL生成html报告,但我必须在服务器目录上使用memorystream而不是IO文件写入。在很大程度上,我创建了一个xml

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方面没有太多经验。因此,任何帮助都将不胜感激。谢谢。

您完全绕过了您的转换:

// 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()
}

另外,在调用writer上的Close之前调用Flush是多余的,因为Close意味着一个Flush操作。

我不清楚您想要实现什么,但我认为使用XmlDocument和XPathDocument从同一内存流加载是没有意义的。在从内存流加载之前,我会将MemoryStream设置为位置0,以便让创建和写入内存流的函数确保它将位置设置为零,或者在调用XmlDocument上的Load之前或在创建XPathDocument之前设置位置,具体取决于您要使用的输入树模型。

对不起,我尝试了这两种方法,因为出现了一个错误,说缺少根元素。忘了评论了。我可以使用它们中的任何一个。在本例中,我使用了XmlDocument。错误根元素丢失是由内存流的位置引起的,它位于您写入的XML之后的末尾,因此您需要确保在尝试从中加载XML之前将流定位在位置0。非常感谢Jamie。似乎writer.ToString正在生成我想要的html输出,但我如何能够以某种方式进行渲染,使其在另一个浏览器选项卡中作为另一个html文件打开。你知道吗?简单的答案是你不能从服务器端。通过在HTTP头中指定内容配置,可以使浏览器显示“文件打开/保存”对话框,但要实际显示新窗口或选项卡,必须使用客户端代码。有多种方法可以做到这一点,比如在超链接或window.open javascript调用中指定目标属性。在HTTP头中指定内容配置可以解决我的问题。我试着做出回应。AddHeaderContent-Disposition,attachment;filename=+writer.ToString+.html;但最终我得到的不是一个html文件,而是一个包含所有html标记的文件。有什么想法吗??谢谢你打电话回复。在回复之前做其他事情之前请先清除?此外,如果在输出内容之前在调试器中检查内容,内容看起来是否正常?xsl中的转换代码可能仍然存在问题。如果是这样的话,我建议再发一个问题。