Frage

Hier ist eine kurze Frage, die mir heute den Kopf zerbricht.

Ich versuche, einen .NET-Datensatz in einen XML-Stream zu konvertieren, ihn mit einer XSL-Datei im Speicher umzuwandeln und das Ergebnis dann in eine neue XML-Datei auszugeben.

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 Originalcode:

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 hat der Reader in der Transformer.Transform-Methode keinen Stammknoten, tatsächlich liest der Reader nichts vom StreamReader.

Meine Frage ist: Was stimmt mit diesem Code nicht?Zweitens: Gibt es eine bessere Möglichkeit, einen Datensatz in XML zu konvertieren/transformieren/speichern?

Bearbeiten:Beide Antworten waren hilfreich und technisch gesehen war Akus näher.Ich neige jedoch zu einer Lösung, die Longhorns ähnlicher ist, nachdem ich beide Lösungen ausprobiert habe.

War es hilfreich?

Lösung

Ich bin mir nicht sicher, aber es scheint, dass Sie die Position im Stream nicht zurückgesetzt haben, bevor Sie ihn an XmlReader übergeben haben.Versuchen Sie, am Anfang Ihres Streams zu suchen, bevor Sie versuchen, daraus zu lesen.Außerdem kann es erforderlich sein, den Stream zu schließen/zu leeren, nachdem Sie Daten darauf geschrieben haben.

BEARBEITEN:

Habe gerade den folgenden Code ausprobiert und es hat perfekt funktioniert:

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

Andere Tipps

Sie müssen den Wurzelknoten auswählen.Hierbei werden keine Datensätze verwendet, aber ich verwende diese Funktion jeden Tag und sie funktioniert großartig.

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;

Bitte schauen Sie es sich an und verwenden Sie es.

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

                    }

                }         
            }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top