2009-12-02 67 views
3

以下代碼工作正常,但很麻煩而且速度慢。我轉換一個XDocument使用XSLT2與撒克遜其他的XDocument,適於利用SaxonWrapper:將XDocument優化爲XDocument XSLT

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

而不是使用字符串來創建你可以嘗試通過從直接的XDocument創建的XmlWriter中的XDocument:

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

除此之外,其他的放緩可能是在SaxonWrapper本身和它的使用的舊的XmlDocument - 而不是速度更快的表弟。

+0

謝謝 - 它很好地整理它。 – djskinner 2009-12-09 16:10:36

+0

誰是更快的表弟? – Devela 2012-10-17 18:44:08

+1

@Devela XDocument和好友(Linq to XML)是.NET BCL中的現代xml API,它在大多數場景中取代了XmlDocuemnt。 – eddiegroves 2012-10-17 22:44:01

4

eddiegroves的解決方案很好。除了有一個問題,作家不會一直被刷新。爲防止出現這種情況,請使用以下內容:

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

這可確保在輸出文檔返回之前編寫器被處置並因此被刷新。