Come ottenere l'uscita di un XslCompiledTransform in un XmlReader?
-
24-10-2019 - |
Domanda
Ho un oggetto XslCompiledTransform
, e voglio che l'output in un oggetto XmlReader
, come ho bisogno di passare attraverso un secondo foglio di stile. Sto diventando un po 'confuso - posso trasformare con successo un po' di XML e leggerlo utilizzando un StreamReader
o un XmlDocument
, ma quando provo un XmlReader
, non ottengo niente.
Nell'esempio sottostante, stylesheet
è il mio oggetto XslCompiledTransform
. La prima uscita di due chiamate Console.WriteLine
il corretto XML trasformato, ma la terza chiamata non dà XML. Sto indovinando potrebbe essere che il XmlTextReader
si aspetta di testo, quindi forse ho bisogno di avvolgere questo in uno StreamReader ..? Che cosa sto facendo di sbagliato?
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
Soluzione
Il href="http://msdn.microsoft.com/en-us/library/system.xml.xmlreader.readouterxml.aspx" rel="nofollow noreferrer"> XmlReader.ReadOuterXml
metodo nodo corrente . Quando si crea prima il lettore, non v'è alcun nodo corrente, in modo da ReadOuterXml
restituirà nulla.
Se si aggiunge la riga:
reader.Read();
... prima della chiamata ReadOuterXml()
, allora funzionerà come previsto.
P.S. Normalmente si dovrebbe verificare il risultato del metodo Read()
al fine di garantire che il lettore abbia realmente qualcosa da leggere.