转换大型Xml文件

时间:2010-05-21 19:00:45

标签: c# xml xslt out-of-memory

我正在使用此扩展方法使用xslt转换非常大的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

2 个答案:

答案 0 :(得分: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;
    }
}
从BT 2.0开始,不推荐使用new XmlTextWriter()。请改用XmlWriter.Create()。与new XmlTextReader()XmlReader.Create()相同。

答案 1 :(得分: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);
}