如何在.Net 2.0 / C#中将StreamReader转换为XMLReader对象
时间:2020-03-05 18:46:50 来源:igfitidea点击:
这是一个快速的问题,我今天一直在反对。
我正在尝试将.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();
回答
我们必须选择根节点。它不使用数据集,但我每天都使用此功能,效果很好。
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;