Hier ist eine kurze Frage, die ich mir heute gegen den Kopf geschlagen habe.Wie konvertiert man einen StreamReader in ein XMLReader-Objekt in. NET 2.0/C#
Ich versuche, ein .Net-Dataset in einen XML-Stream zu konvertieren, transformieren Sie es mit einer XSL-Datei im Speicher und geben Sie das Ergebnis in eine neue XML-Datei.
Hier ist die aktuelle Lösung:
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();
Hier ist der ursprüngliche 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)
Aus irgendeinem Grund in der transformer.Transform Methode hat der Leser keine Wurzelknoten in der Tat der Leser isn Ich lese nichts vom StreamReader.
Meine Fragen ist was ist falsch mit diesem Code? Gibt es zweitens eine bessere Möglichkeit zum Konvertieren/Transformieren/Speichern eines Datensatzes in XML?
Edit: Beide Antworten waren hilfreich und technisch aku war näher. Ich stehe jedoch auf eine Lösung, die Longhorns mehr ähnelt, nachdem beide Lösungen versucht wurden.
aku, bitte, bitte, verwenden Sie 'mit (...) {...}' 'Blöcke für IDisposable's so Menschen gewonnen‘ t kopieren-fügen Sie Ihren Code ein und lernen schlechten Stil daraus :(Wenn Sie möchten, dass es so kurz wie möglich für kleine Antwortgröße ist, erwähnen Sie irgendwo, dass in echtem Code SOLLTEN 'using' verwenden. – IgorK
Ich glaube nicht, dass es ist B. die meisten MSDN-Codebeispiele keine guten Praktiken demonstrieren, die Leute sollten mit dem Kopf denken und nicht blind den Code von jemandem kopieren und einfügen. Auch zusätzliche Klammern machen den Code auf einer Webseite weniger lesbar. – aku
@aku, das Problem ist, wenn alle Beispiele fehlen, dann neue Programmierer werden es nirgendwo sehen und müssen es auf die harte Art lernen, auch gibt es keine Notwendigkeit, den "StreamReader" zu erstellen, den Sie einfach den Stream in " XmlReader.Create (streamen) "? – Peter