Ottimizzazione XDocument a XDocument XSLT
Domanda
Il seguente codice funziona, ma è disordinato e lento. Sto trasformare una XDocument ad un altro utilizzando XDocument XSLT2 con Saxon, adattato con SaxonWrapper:
public static XDocument HSRTransform(XDocument source)
{
System.Reflection.Assembly thisExe = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream xslfile = thisExe.GetManifestResourceStream("C2KDataTransform.Resources.hsr.xsl");
XmlDocument xslDoc = new XmlDocument();
xslDoc.Load(xslfile);
XmlDocument sourceDoc = new XmlDocument();
sourceDoc.Load(source.CreateReader());
var sw = new StringWriter();
Xsl2Processor processor = new Xsl2Processor();
processor.Load(xslDoc);
processor.Transform(sourceDoc, new XmlTextWriter(sw));
XDocument outputDoc = XDocument.Parse(sw.ToString());
return outputDoc;
}
Mi rendo conto che la lentezza potrebbe in realtà essere nei bit non ho alcun controllo su, ma ci sono modi migliori per fare tutto la commutazione tra XDocument e XmlDocument e l'uso di scrittori?
Soluzione
Invece di usare le stringhe per creare il XDocument si può provare il passaggio in un XmlWriter creato dal XDocument direttamente:
XDocument outputDoc = new XDocument();
processor.Transform(sourceDoc, outputDoc.CreateWriter());
return outputDoc;
Oltre a questo, gli altri rallentamenti sono probabilmente nel SaxonWrapper sé ed è l'uso del XmlDocument più vecchio - piuttosto che è il cugino più veloce
.Altri suggerimenti
eddiegroves 's soluzione va bene. Tranne che v'è un problema che lo scrittore non ottiene arrossato tutto il tempo. Per evitare che questo uso il seguente:
XDocument outputDoc = new XDocument();
using (var writer = outputDoc.CreateWriter()) {
processor.Transform(sourceDoc, writer);
}
return outputDoc;
Questo assicura che l'autore è disposto - e quindi lavata -. Prima che il documento di output viene restituito