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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/40999/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-03 09:49:33  来源:igfitidea点击:

How to Convert a StreamReader into an XMLReader object in .Net 2.0/C#

提问by Trevor Abell

Here's a quick question I've been banging my head against today.

这是我今天一直在问的一个快速问题。

I'm trying to convert a .Net dataset into an XML stream, transform it with an xsl file in memory, then output the result to a new XML file.

我正在尝试将 .Net 数据集转换为 XML 流,使用内存中的 xsl 文件将其转换,然后将结果输出到新的 XML 文件。

Here's the current solution:

这是当前的解决方案:

        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();

Here's the original code:

这是原始代码:

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)

For some reason in the transformer.Transform method, the reader has no root node, in fact the reader isn't reading anything from the StreamReader.

由于某些原因,在transformer.Transform 方法中,读取器没有根节点,实际上读取器没有从StreamReader 读取任何内容。

My questions is what is wrong with this code? Secondarily, is there a better way to convert/transform/store a dataset into XML?

我的问题是这段代码有什么问题?其次,是否有更好的方法将数据集转换/转换/存储为 XML?

Edit: Both answers were helpful and technically aku's was closer. However I am leaning towards a solution that more closely resembles Longhorn's after trying both solutions.

编辑:这两个答案都有帮助,技术上 aku 更接近。但是,在尝试了两种解决方案后,我倾向于使用更类似于 Longhorn 的解决方案。

采纳答案by aku

I'm not sure but it seems that you didn't reset position in stream before passing it to XmlReader. Try to seek at the beginning of your stream before trying to read from it. Also it may be necessary to close\flush stream after you wrote some data to it.

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

EDIT:

编辑

Just tried following code and it worked perfectly:

刚刚尝试了以下代码,效果很好:

    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();

回答by David Basarab

You must select the root node. This doesn't use Datasets, but I use this function everyday and it works great.

您必须选择根节点。这不使用数据集,但我每天都使用这个功能,而且效果很好。

System.Xml.XmlDocument orgDoc = new System.Xml.XmlDocument();
orgDoc.LoadXml(orgXML);

// MUST SELECT THE ROOT NODE
XmlNode transNode = orgDoc.SelectSingleNode("/");
System.Text.StringBuilder sb = new System.Text.StringBuilder();
XmlWriter writer = XmlWriter.Create(sb);

System.IO.StringReader stream = new System.IO.StringReader(transformXML);
XmlReader reader = XmlReader.Create(stream);

System.Xml.Xsl.XslCompiledTransform trans = new System.Xml.Xsl.XslCompiledTransform();
trans.Load(reader);
trans.Transform(transNode, writer);

XmlDocument doc = new XmlDocument();
doc.LoadXml(sb.ToString());

return doc;

回答by user1453680

please look it and use..

请看一下并使用..

using (MemoryStream memStream = new MemoryStream())
            {
                memStream.Write(Encoding.UTF8.GetBytes(xmlBody), 0, xmlBody.Length);
                memStream.Seek(0, SeekOrigin.Begin);

                using (StreamReader reader = new StreamReader(memStream))
                {
                    // xml reader setting.
                    XmlReaderSettings xmlReaderSettings = new XmlReaderSettings()
                    {
                        IgnoreComments = true,
                        IgnoreWhitespace = true,

                    };

                    // xml reader create.
                    using (XmlReader xmlReader = XmlReader.Create(reader, xmlReaderSettings))
                    {                           
                        XmlSerializer xmlSerializer = new XmlSerializer(typeof(LoginInfo));
                        myObject = (LoginInfo)xmlSerializer.Deserialize(xmlReader);

                    }

                }         
            }