Question

Voici une petite question contre laquelle je me suis cogné la tête aujourd'hui.

J'essaie de convertir un ensemble de données .Net en flux XML, de le transformer avec un fichier XSL en mémoire, puis d'afficher le résultat dans un nouveau fichier XML.

Voici la solution actuelle :

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

Voici le code d'origine :

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)

Pour une raison quelconque dans la méthode transformer.Transform, le lecteur n'a pas de nœud racine, en fait, le lecteur ne lit rien à partir de StreamReader.

Ma question est la suivante : quel est le problème avec ce code ?Deuxièmement, existe-t-il un meilleur moyen de convertir/transformer/stocker un ensemble de données en XML ?

Modifier:Les deux réponses étaient utiles et techniquement, celle d'aku était plus proche.Cependant, je penche pour une solution qui ressemble plus à celle de Longhorn après avoir essayé les deux solutions.

Était-ce utile?

La solution

Je ne suis pas sûr, mais il semble que vous n'ayez pas réinitialisé la position dans le flux avant de le transmettre à XmlReader.Essayez de chercher au début de votre flux avant d'essayer de le lire.Il peut également être nécessaire de fermer\flush le flux après y avoir écrit des données.

MODIFIER:

Je viens d'essayer le code suivant et cela a parfaitement fonctionné :

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

Autres conseils

Vous devez sélectionner le nœud racine.Cela n'utilise pas de jeux de données, mais j'utilise cette fonction tous les jours et cela fonctionne très bien.

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;

s'il vous plaît, regardez-le et utilisez-le.

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

                    }

                }         
            }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top