Comment obtenir la sortie d'un XslCompiledTransform dans un XmlReader?
-
24-10-2019 - |
Question
J'ai un objet XslCompiledTransform
, et je veux la sortie dans un objet XmlReader
, que je dois passer à travers une seconde feuille de style. Je reçois un peu confus - je peux transformer avec succès certains XML et le lire en utilisant soit un StreamReader
ou un XmlDocument
, mais lorsque je tente un XmlReader
, je reçois rien.
Dans l'exemple ci-dessous, stylesheet
est mon objet XslCompiledTransform
. La première sortie deux appels de Console.WriteLine
le XML correct transformé, mais le troisième appel ne donne pas de XML. Je devine que ce pourrait être que le XmlTextReader
attend le texte, donc je dois peut-être d'envelopper cela dans un StreamReader ..? Qu'est-ce que je fais mal?
MemoryStream transformed = new MemoryStream();
stylesheet.Transform(input, args, transformed);
transformed.Position = 0;
StreamReader s = new StreamReader(transformed);
Console.WriteLine("s = " + s.ReadToEnd()); // writes XML
transformed.Position = 0;
XmlDocument doc = new XmlDocument();
doc.Load(transformed);
Console.WriteLine("doc = " + doc.OuterXml); // writes XML
transformed.Position = 0;
XmlReader reader = new XmlTextReader(transformed);
Console.WriteLine("reader = " + reader.ReadOuterXml()); // no XML written
La solution
La méthode XmlReader.ReadOuterXml
lit le XML pour le noeud courant . Lorsque vous créez le lecteur, il n'y a pas de noeud courant, donc ReadOuterXml
retournera rien.
Si vous ajoutez la ligne:
reader.Read();
... avant l'appel ReadOuterXml()
, il fonctionnera comme prévu.
P.S. Vous devriez normalement tester le résultat de la méthode Read()
pour faire en sorte que le lecteur a fait quelque chose à lire.