c# - 如何在 .Net 2.0/C# 中将 StreamReader 转换为 XMLReader 对象

标签 c# .net xml xslt stream

这是我今天一直在思考的一个简短问题。

我正在尝试将 .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 的解决方案。

最佳答案

我不确定,但似乎您在将流传递给 XmlReader 之前没有重置它在流中的位置。在尝试从流中读取之前尝试在流的开头进行搜索。在向流中写入一些数据后,可能还需要关闭\刷新流。

编辑:

刚刚尝试了以下代码,它运行良好:

    BufferedStream stream = new BufferedStream(new MemoryStream());
    stream.Write(Encoding.ASCII.GetBytes("<xml>foo</xml>"), 0, "<xml>foo</xml>".Length);
    stream.Seek(0, SeekOrigin.Begin);
    StreamReader sr = new StreamReader(stream);
    XmlReader reader = XmlReader.Create(sr);
    while (reader.Read())
    {
         Console.WriteLine(reader.Value);
    }
    stream.Close();

关于c# - 如何在 .Net 2.0/C# 中将 StreamReader 转换为 XMLReader 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40999/

相关文章:

c# - 为什么这个 C# 函数的行为就像我在使用指针一样?

.Net Profiling API 方法

xml - 使用 <import> 时出现 Spring/Eclipse 'referenced bean not found' 警告?

c# - 将 SignalR 与 Azure Service Fabric 结合使用

c# - 使用 NUnit 和 C# 进行异步单元测试

.net - WCF - 赢取应用程序 “The maximum string content length quota (8192) has been exceeded while reading XML data.”

c# - 无法关闭虚拟键盘

android - 如何从谷歌自定义搜索 api 获取无限查询

android - 2x3 自定义按钮网格布局不适合 TableRow

c# - 安全与不安全代码