今天我遇到了一个问题,希望你能帮忙解决。
我正在尝试将一个 .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的答案更接近。然而,在尝试了两种解决方案之后,我更倾向于一个更接近Longhorn的解决方案。
using(...) { ... }
块来处理IDisposable
对象,这样人们就不会从你的代码中复制粘贴学习到不良风格 :( 如果您希望答案尽可能简短以便回答大小较小,请在某个地方提到在实际代码中他们应该使用using
。 - IgorK