Otimizando XDocument para XDocument XSLT
Pergunta
As seguintes obras de código, mas é confuso e lento. Estou transformando um XDocument para outro XDocument usando XSLT2 com o Saxon, adaptado usando 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;
}
Eu percebo que a lentidão pode ser realmente nos bits tenho nenhum controle sobre, mas existem melhores maneiras de fazer toda a comutação entre XDocument e XmlDocument e uso de escritores?
Solução
Ao invés de usar cordas para criar o XDocument você pode tentar passar em um XmlWriter criado a partir da XDocument directamente:
XDocument outputDoc = new XDocument();
processor.Transform(sourceDoc, outputDoc.CreateWriter());
return outputDoc;
Além disso, as outras desacelerações são, provavelmente, no próprio SaxonWrapper e do uso do XmlDocument mais velhos - em vez do que primo mais rápido
.Outras dicas
eddiegroves 's solução é bom. Exceto que não é um problema que o escritor não se corou o tempo todo. Para evitar isso, use o seguinte:
XDocument outputDoc = new XDocument();
using (var writer = outputDoc.CreateWriter()) {
processor.Transform(sourceDoc, writer);
}
return outputDoc;
Isso garante que o escritor está disposto - e, portanto, corada -. Antes do documento de saída é retornado