2009-12-02 41 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; 

这可确保在输出文档返回之前编写器被处置并因此被刷新。