【发布时间】: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