2008-09-03 6 views
3

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.

Antwort

6

Ich bin mir nicht sicher, aber es scheint, dass Sie die Position im Stream nicht zurückgesetzt haben, bevor Sie es an XmlReader übergeben. Versuchen Sie, am Anfang Ihres Streams zu suchen, bevor Sie versuchen, daraus zu lesen. Es kann auch notwendig sein, \ flush stream zu schließen, nachdem Sie einige Daten darauf geschrieben haben.

EDIT:

einfach folgenden Code ausprobiert und es funktionierte perfekt:

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

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

+0

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

+0

@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

2

Sie müssen den Wurzelknoten auswählen. Dies verwendet keine Datasets, aber ich benutze diese Funktion jeden Tag und es funktioniert super.

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; 
0

bitte suchen und verwenden ..

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

        } 

       }   
      } 
Verwandte Themen