Konvertierung von StreamReader zu XmlReader in .Net 2.0/C#

In der Welt der .NET-Programmierung ist die Arbeit mit XML-Dateien eine häufige Aufgabe, insbesondere wenn es um Datensätze geht. Wenn Sie jemals versucht haben, einen StreamReader in einen XmlReader zu konvertieren und auf eine Wand gestoßen sind, sind Sie nicht allein.

In diesem Blogbeitrag werden wir ein häufiges Problem, das bei dieser Konvertierung auftritt, aufschlüsseln und erkunden, wie man es effektiv angehen kann.

Das Problem

Sie versuchen, ein .NET DataSet in einen XML-Strom zu konvertieren, eine XSL-Transformation im Arbeitsspeicher anzuwenden und das modifizierte XML in eine neue Datei zu schreiben. Schwierigkeiten treten jedoch auf, wenn Sie versuchen, einen XmlReader aus einem StreamReader zu erstellen, der anscheinend keine Daten enthält.

Hier ist eine kurze Übersicht über Ihren Versuchs-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; // Position zurücksetzen für das Lesen

XmlReader reader = XmlReader.Create(sr, null); // Problem tritt hier auf

Das Hauptproblem ist, dass der XmlReader erstellt wird, ohne irgendwelche Daten aus dem StreamReader zu erkennen.

Ursache verstehen

Die wichtigsten Probleme, die im Code zu beachten sind:

  • Stream-Positionierung: Die Position des Streams muss zurückgesetzt werden, damit der StreamReader vom Anfang des Streams lesen kann.
  • Stream-Schließung: Eine ordnungsgemäße Handhabung des Streams, einschließlich des Schließens oder Flushens nach dem Schreiben, ist entscheidend für die Datenintegrität.

Die Lösung

Hier ist ein einfacher Ansatz, um die Probleme mit Ihrem vorhandenen Code zu beheben:

Schritt 1: Stream-Position zurücksetzen

Stellen Sie sicher, dass die Position des BufferedStream zurückgesetzt ist, bevor Sie vom StreamReader lesen. Dies kann mit der Seek-Methode oder durch direktes Setzen der Position-Eigenschaft erreicht werden.

Schritt 2: XmlReader korrekt erstellen

Erstellen Sie einen neuen XmlReader, nachdem sichergestellt wurde, dass der Stream korrekt auf den Anfang positioniert ist.

Schritt 3: Funktionierenden Code implementieren

Hier ist ein funktionierendes Beispiel, wie diese Operationen durchgeführt werden können:

BufferedStream stream = new BufferedStream(new MemoryStream());
stream.Write(Encoding.ASCII.GetBytes("<xml>foo</xml>"), 0, "<xml>foo</xml>".Length);
stream.Seek(0, SeekOrigin.Begin); // Wichtig: Stream-Position zurücksetzen

using (StreamReader sr = new StreamReader(stream))
{
    using (XmlReader reader = XmlReader.Create(sr))
    {
        while (reader.Read())
        {
            Console.WriteLine(reader.Value);
        }
    }
}

Erklärung des Codes:

  • In den Stream schreiben: Hier schreiben wir eine einfache XML-Struktur in den Stream.
  • Position zurücksetzen: Durch die Verwendung von Seek(0, SeekOrigin.Begin) stellen wir sicher, dass unser Stream-Reader von Anfang an startet.
  • Lesen mit XmlReader: Der XmlReader.Create(sr) liest das XML, und wir können nun dessen Inhalt ausgeben.

Fazit

Durch die ordnungsgemäße Handhabung des Streams und das Zurücksetzen auf die richtige Position können Sie die Fallstricke vermeiden, die bei der Konvertierung eines StreamReader in einen XmlReader in .Net 2.0/C# auftreten. Die Arbeit mit XML in .NET kann unkompliziert sein, wenn wir auf die Verwaltung unseres Streams achten.

Implementieren Sie diese Änderungen, und Sie sollten eine deutliche Verbesserung Ihrer XML-Verarbeitungsfähigkeiten feststellen!