Оптимизация XDocument для XDocument XSLT - PullRequest
3 голосов
/ 02 декабря 2009

Следующий код работает, но грязный и медленный. Я преобразую XDocument в другой XDocument, используя XSLT2 с Saxon, адаптированный с помощью 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;
}

Я понимаю, что медлительность может быть в битах, которые я не контролирую, но есть ли лучшие способы сделать все переключение между XDocument и XmlDocument и использование писателей?

Ответы [ 2 ]

5 голосов
/ 08 октября 2012

eddiegroves решение в порядке. Кроме того, есть проблема, что писатель не покраснел все время. Для предотвращения этого используйте следующее:

XDocument outputDoc = new XDocument();
using (var writer = outputDoc.CreateWriter()) {
    processor.Transform(sourceDoc, writer);
}
return outputDoc;

Это гарантирует, что устройство записи удаляется - и, следовательно, очищается - до того, как будет возвращен выходной документ.

2 голосов
/ 06 декабря 2009

Вместо того, чтобы использовать строки для создания XDocument, вы можете попробовать передать XmlWriter, созданный из XDocument напрямую:

XDocument outputDoc = new XDocument();
processor.Transform(sourceDoc, outputDoc.CreateWriter());
return outputDoc;

Кроме этого, другие замедления, вероятно, находятся в самом SaxonWrapper, и он использует более старый XmlDocument, а не более быстрый кузен.

...