Преобразование больших файлов XML - PullRequest
4 голосов
/ 21 мая 2010

Я использовал этот метод расширения для преобразования очень больших файлов XML с помощью xslt.

К сожалению, я получаю исключение OutOfMemoryException в строке source.ToString ().

Я понимаю, что должен быть лучший путь, я просто не уверен, что это будет?

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

Мысли? Решения? И т.д.

UPDATE: Теперь, когда это решено, у меня есть проблемы с проверкой схемы! Проверка больших файлов XML

Ответы [ 2 ]

8 голосов
/ 21 мая 2010

Попробуйте это:

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().

1 голос
/ 04 мая 2011

Для больших файлов XML вы можете попробовать использовать XPathDocument, как предложено в Статья базы знаний Майкрософт .

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