2010-05-21 94 views
4

我正在使用此擴展方法來轉換帶有xslt的非常大的xml文件。轉換大型XML文件

不幸的是,我在source.ToString()行上得到一個OutOfMemoryException。

我意識到一定有更好的辦法,我只是不確定那會是什麼?

public static XElement Transform(this XElement source, string xslPath, XsltArgumentList arguments) 
{ 
     var doc = new XmlDocument(); 
     doc.LoadXml(source.ToString()); 

     var xsl = new XslCompiledTransform(); 
     xsl.Load(xslPath); 

     using (var swDocument = new StringWriter(System.Globalization.CultureInfo.InvariantCulture)) 
     { 
      using (var xtw = new XmlTextWriter(swDocument)) 
      { 
       xsl.Transform((doc.CreateNavigator()), arguments, xtw); 
       xtw.Flush(); 
       return XElement.Parse(swDocument.ToString()); 
      } 
     } 
} 

想法?解決方案?等

更新: 現在,這已解決,我有驗證架構的問題! Validating large Xml files

+0

有多大很大? – 2010-05-21 19:04:21

+0

我已經發現改變* doc.LoadXml(source.ToString()); *到* doc.Load(source.CreateReader()); *幫助...不知道它的限制是什麼。 – CaffGeek 2010-05-21 19:04:23

+0

@Rob Goodwin,50MB,這隻有1條記錄......可能會有更多。 – CaffGeek 2010-05-21 19:06:55

回答

8

嘗試這種情況:

using System.Xml.Linq; 
using System.Xml.XPath; 
using System.Xml.Xsl; 

static class Extensions 
{ 
    public static XElement Transform(
     this XElement source, string xslPath, XsltArgumentList arguments) 
    { 
     var xsl = new XslCompiledTransform(); 
     xsl.Load(xslPath); 

     var result = new XDocument(); 
     using (var writer = result.CreateWriter()) 
     { 
      xsl.Transform(source.CreateNavigator(), arguments, writer); 
     } 
     return result.Root; 
    } 
} 

順便說一句,new XmlTextWriter()被棄用的.NET 2.0。改爲使用XmlWriter.Create()。與new XmlTextReader()XmlReader.Create()相同。

+0

正確 - +1然後! – 2010-05-21 19:16:55

+0

謝謝,這個作品很棒!我添加了一個跟進問題,與驗證(xsd) http://stackoverflow.com/questions/2884966/validating-large-xml-files – CaffGeek 2010-05-21 19:26:06

1

對於大型XML文件,您可以嘗試按照Microsoft Knowledge Base article中的建議使用XPathDocument。

XPathDocument srcDoc = new XPathDocument(srcFile); 
XslCompiledTransform myXslTransform = new XslCompiledTransform(); 
myXslTransform.Load(xslFile); 
using (XmlWriter destDoc = XmlWriter.Create(destFile)) 
{ 
    myXslTransform.Transform(srcDoc, destDoc); 
}