C# XSLT 转换内存不足

标签 c# xml xslt

全部,

我有以下使用 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/

相关文章:

c# - 有条件地编译 UI 组件和逻辑

C# http 监听器不在本地主机上监听,仅适用于 FQDN

c# - 按类别过滤图像,RSS 阅读器

java - 如何显示水平 Recyclerview - 显示水平项目时遇到问题

html - 如何使用xsl :output获取带有url的doctype标签

regex - XSLT - 检查元素字符串中是否存在模式

c# - 从 lambda 中调用函数

mysql - Spring批处理从xml文件读取并写入数据库。需要步骤 1 自动生成步骤 2 的 key

xml - 使用 XSLT 访问 XML

xml - XSL - 嵌入式查找表 - 变量的查找值