1

XMLおよび対応するXSLからHTML レポートを生成する必要がありますが、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 レポートの作成を台無しにしていて、そのファイルをクライアント エンドに送信する方法がわかりません。私はメモリストリームを使った経験があまりありません。ですから、どんな助けでも大歓迎です。ありがとうございました。

4

2 に答える 2

0

あなたが達成したいことは私には明らかではありませんが、XmlDocument と XPathDocument の両方を使用して同じメモリ ストリームから読み込むことは意味がないと思います。また、メモリ ストリームから読み込む前に、メモリ ストリームを位置 0 に設定します。そのため、メモリ ストリームを作成してメモリ ストリームに書き込む関数で、位置がゼロに設定されるようにするか、XmlDocument で Load を呼び出す前、または XPathDocument を作成する前にそれを行います。使用する入力ツリー モデルによって異なります。

于 2012-05-18T15:41:32.590 に答える
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()
}

また、ライターで Close を呼び出す直前に Flush を呼び出すことは、Close がフラッシュ操作を意味するため冗長です。

于 2012-05-18T15:32:57.950 に答える