【问题标题】:Transforming large Xml files转换大型 Xml 文件
【发布时间】:2010-05-21 19:00:44
【问题描述】:

我使用这种扩展方法通过 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

【问题讨论】:

  • 多大才算非常大?
  • 我已经发现将 doc.LoadXml(source.ToString()); 更改为 doc.Load(source.CreateReader()); 有帮助……但不确定它的限制是什么。
  • @Rob Goodwin,50MB,这只是 1 条记录...可能会有更多记录。
  • 最大的问题是您同时拥有一个 XElement 和一个 XmlDocument —— 如果您只使用 XmlDocument,这将是您需要的内存的两倍。我的建议是不要使用 LINQ(或者在创建 XmlDocument 之前以某种方式摆脱 LINQ 对象)。使用 XPathDocument 代替 XmlDocument 也会有所帮助。

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


【解决方案1】:

试试这个:

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() 相同。

【讨论】:

【解决方案2】:

对于大型 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);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-08-14
    • 2012-10-14
    • 2019-01-15
    • 2012-06-17
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多