全部,
我有以下使用 XSLT 转换 XML 文档的代码。 问题是当 XML 文档大约为 12MB 时,C# 内存不足。 有没有一种不同的方法可以在不消耗那么多内存的情况下进行转换?
public string Transform(XPathDocument myXPathDoc, XslCompiledTransform myXslTrans)
{
try
{
var stm = new MemoryStream();
myXslTrans.Transform(myXPathDoc, null, stm);
var sr = new StreamReader(stm);
return sr.ReadToEnd();
}
catch (Exception e)
{
//Log the Exception
}
}
这是堆栈跟踪:
at System.String.GetStringForStringBuilder(String value, Int32 startIndex, Int32 length, Int32 capacity)
at System.Text.StringBuilder.GetNewString(String currentString, Int32 requiredLength)
at System.Text.StringBuilder.Append(Char[] value, Int32 startIndex, Int32 charCount)
at System.IO.StreamReader.ReadToEnd()
at Transform(XPathDocument myXPathDoc, XslCompiledTransform myXslTrans)
最佳答案
我要做的第一件事是隔离问题。停止运行整个 MemoryStream 业务并将输出流式传输到一个文件,例如:
using (XmlReader xr = XmlReader.Create(new StreamReader("input.xml")))
using (XmlWriter xw = XmlWriter.Create(new StreamWriter("output.xml")))
{
xslt.Transform(xr, xw);
}
如果您仍然遇到内存不足的异常(我敢打赌您会弃钱),这很公平地表明问题不在于输出的大小,而在于转换本身,例如无限递归的东西,例如:
<xsl:template match="foo">
<bar>
<xsl:apply-templates select="."/>
</bar>
</xsl:template>
关于C# XSLT 转换内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3777217/