2010-05-21 71 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); 
}