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

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

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

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

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

这是当前的解决方案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
        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();

这是原始代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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之前重置流中的位置。 在尝试从流开始读取之前,请先尝试查找。 另外,在向其中写入一些数据后,可能有必要关闭\刷新流。

编辑:

只是尝试下面的代码,它完美地工作:

1
2
3
4
5
6
7
8
9
10
    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();

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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;

请看看并使用..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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);

                    }

                }        
            }


推荐阅读

    linux的查看内存命令?

    linux的查看内存命令?,情况,系统,信息,电脑,状态,工具,内存,命令,数据,总量,L

    linux下内存调整命令?

    linux下内存调整命令?,系统,情况,地址,工具,总量,总额,管理,内存,机制,内核,

    linux内存大小命令?

    linux内存大小命令?,系统,情况,电脑,信息,工具,状态,命令,内存,环境,分析,Lin

    linux内存命令大全?

    linux内存命令大全?,地址,系统,信息,工作,命令,情况,代码,分析,数据,工具,[Li

    linux命令监控内存?

    linux命令监控内存?,情况,系统,工具,信息,环境,分析,命令,工作,实时,电脑,lin

    linux内存监控命令?

    linux内存监控命令?,情况,系统,信息,电脑,总量,内存,命令,单位,环境,第一,lin

    linux命令查找内存?

    linux命令查找内存?,情况,系统,信息,工具,状态,分析,数字,内存,命令,适当,怎

    linux常用命令查内存?

    linux常用命令查内存?,系统,情况,实时,分析,工具,信息,内存,总量,状态,命令,

    linux检测内存命令?

    linux检测内存命令?,情况,系统,工具,分析,信息,实时,状态,检测,内存,电脑,怎

    查看内存的命令linux?

    查看内存的命令linux?,系统,情况,信息,工具,数据,内存,实时,分析,电脑,单位,l

    内存回收linux命令?

    内存回收linux命令?,系统,地址,技术,管理,不了,数据,名称,发展,环境,管理系

    linux命令行查询内存?

    linux命令行查询内存?,情况,系统,信息,单位,工具,内存,状态,分析,命令,电脑,l

    linux好用的内存命令?

    linux好用的内存命令?,系统,情况,信息,数据,内存,命令,总量,存量,方法,终端,l

    linux命令剩余内存?

    linux命令剩余内存?,情况,系统,信息,工具,内存,分析,命令,单位,实时,电脑,Lin

    linux命令查看没内存?

    linux命令查看没内存?,情况,系统,信息,工具,内存,单位,分析,命令,总量,数据,

    linux磁盘总内存命令?

    linux磁盘总内存命令?,情况,系统,信息,服务,命令,单位,数据,管理,地址,实时,l

    linux关于内存命令?

    linux关于内存命令?,情况,系统,信息,命令,电脑,总额,工具,代码,位置,暂停,Lin

    linux内存管理命令?

    linux内存管理命令?,系统,等级,工作,信息,命令,基础,地址,情况,管理,标准,Lin

    内存泄漏linux命令?

    内存泄漏linux命令?,工具,检测,信息,服务,系统,分析,中心,报告,交易,生产,Lin

    命令查看linux内存?

    命令查看linux内存?,情况,系统,信息,工具,电脑,命令,内存,环境,数据,总量,查