2010-05-21 12 views
4

J'utilisais cette méthode d'extension pour transformer de très gros fichiers xml avec un xslt.Transformation de gros fichiers XML

Malheureusement, j'obtiens une exception OutOfMemoryException sur la ligne source.ToString().

Je me rends compte qu'il doit y avoir un meilleur moyen, je ne suis pas sûr de ce que ce serait?

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()); 
      } 
     } 
} 

Pensées? Solutions? Etc.

MISE À JOUR: Maintenant que cela est résolu, j'ai des problèmes avec la validation du schéma! Validating large Xml files

+0

Quelle est la taille de la taille? –

+0

J'ai déjà trouvé changer * doc.LoadXml (source.ToString()); * en * doc.Load (source.CreateReader()); * aide ... pas sûr de ce que sont ses limites. – CaffGeek

+0

@Rob Goodwin, 50MB, et c'est seulement 1 enregistrement ... il y en aura probablement plus. – CaffGeek

Répondre

8

Essayez ceci:

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; 
    } 
} 

BTW, new XmlTextWriter() est obsolète depuis .NET 2.0. Utilisez XmlWriter.Create() à la place. Idem avec new XmlTextReader() et XmlReader.Create().

+0

Juste sur - +1 alors! –

+0

Merci, cela fonctionne très bien! J'ai ajouté une question de suivi liée à la validation (xsd) http://stackoverflow.com/questions/2884966/validating-large-xml-files – CaffGeek

1

Pour les fichiers XML de grande taille, vous pouvez essayer d'utiliser XPathDocument comme indiqué dans Microsoft Knowledge Base article.

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