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
Était-ce utile?

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.

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