これは、今日頭を悩ませてきた簡単な質問です。
.Net データセットを XML ストリームに変換し、メモリ内の xsl ファイルで変換してから、結果を新しい XML ファイルに出力しようとしています。
現在の解決策は次のとおりです。
string transformXML = @"pathToXslDocument";
XmlDocument originalXml = new XmlDocument();
XmlDocument transformedXml = new XmlDocument();
XslCompiledTransform transformer = new XslCompiledTransform();
DataSet ds = new DataSet();
string filepath;
originalXml.LoadXml(ds.GetXml()); //data loaded prior
StringBuilder sb = new StringBuilder();
XmlWriter writer = XmlWriter.Create(sb);
transformer.Load(transformXML);
transformer.Transform(originalXml, writer); //no need to select the node
transformedXml.LoadXml(sb.ToString());
transformedXml.Save(filepath);
writer.Close();
元のコードは次のとおりです。
BufferedStream stream = new BufferedStream(new MemoryStream());
DataSet ds = new DataSet();
da.Fill(ds);
ds.WriteXml(stream);
StreamReader sr = new StreamReader(stream, true);
stream.Position = 0; //I'm not certain if this is necessary, but for the StreamReader to read the text the position must be reset.
XmlReader reader = XmlReader.Create(sr, null); //Problem is created here, the XmlReader is created with none of the data from the StreamReader
XslCompiledTransform transformer = new XslCompiledTransform();
transformer.Load(@"<path to xsl file>");
transformer.Transform(reader, null, writer); //Exception is thrown here, though the problem originates from the XmlReader.Create(sr, null)
何らかの理由で、transformer.Transform メソッドでは、リーダーにルート ノードがありません。実際、リーダーは StreamReader から何も読み取っていません。
私の質問は、このコードの何が問題なのですか? 第二に、データセットを XML に変換/変換/保存するより良い方法はありますか?
編集: どちらの回答も役に立ち、技術的には aku の方が近かったです。ただし、両方のソリューションを試した後、ロングホーンのソリューションによく似たソリューションに傾倒しています。