【问题标题】:Using XmlReader in .NET for XSLT Transformation of very big XML files在 .NET 中使用 XmlReader 对非常大的 XML 文件进行 XSLT 转换
【发布时间】:2011-03-04 10:38:02
【问题描述】:

全部,

我不确定这是否可能,所以我想最好在这里问一下。 在 C# 中,我对非常大的 XML 文件(每个 15MB)进行了很多 XSLT 转换 我一直面临的问题是 XPathDocument 使用太多数据来以树状格式表示内存中的 XML。 是否可以使用基于 SAX 的 XmlReader 来使用 XSLT 转换文档?

非常感谢,

MK

【问题讨论】:

  • 是的,可以使用 XMLReader,但它应该用于此类处理。
  • @Furqan:有什么可以看的例子吗?
  • 恐怕用标准的.net框架类是做不到的。阅读stackoverflow.com/questions/3101048/…的答案
  • BizTalk 有一个名为 VirtualStream 的 Stream 实现,它由磁盘支持。 VirtualStream 旨在帮助保持内存管理“更平坦”,因为大小为 85K(?)的对象被放置在大型对象堆上,该堆在 GC 期间被清扫,但没有被压缩……导致内存碎片和“膨胀”……我不'不知道是否有非 BizTalk 相关的版本。

标签: c# xml xslt


【解决方案1】:

使用 XSLT 1.0,您无法避免处理器构建完整文档的树模型并对其进行操作,这就是 XSLT 1.0 的定义方式。在 XSLT 3.0 中,您将能够执行 streaming 转换,在 Saxon 9.3 中已经有一个早期实现:http://www.saxonica.com/documentation/sourcedocs/streaming.xml。

另一方面,我不明白为什么“15MB”文件“非常大”。在 .NET 平台上使用 XSLT 1.0 处理此类文件时,您真的会耗尽内存吗?

【讨论】:

    【解决方案2】:

    我将使用 XPathNavigator 类(使用 CreateNavigator 从您的 XPathDocument 创建)和 XslCompiledTransform 而不是 XslTransform 来执行转换。我认为 XPathNavigator 的工作方式类似于 SAX 解析器,不会将整个文件加载到内存中。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      你可以这样做,

                XmlTextReader xtr = new XmlTextReader("C:\abc.xml");
                XPathDocument xp = new XPathDocument(xtr);
                XPathNavigator xpn =   xp.CreateNavigator();
      

      希望这能让你继续前进。

      【讨论】:

      • 请参阅:我面临的持续问题是 XPathDocument 使用太多数据来以树状格式表示内存中的 XML。
      • -1:不要再使用new XmlTextReader。另外,XSL 转换在哪里?
      【解决方案4】:

      .net 库中有一组 XSL 控件可用,它们继承自标准 Xml 控件。

      这里有一篇文章:

      http://support.microsoft.com/kb/307322

      using System;
      using System.Xml;
      using System.Xml.Xsl; 
      
      namespace XSLTransformation
      {
          public class Class1
          {
              static void Main(string[] args)
              {
                  XslTransform myXslTransform = new XslTransform();
      
                  myXslTransform.Load("reference.xsl"); 
      
                  myXslTransform.Transform("inputfile.xml", "outputfile.xml");
      
               }
          }
      }
      

      【讨论】:

      • 只要 inputfile.xml 被加载为 XmlReader 而不是 XPathDocument 或 XmlDocument 就很好。谢谢,我试试看。
      • @koumides 看起来我有点失败了。虽然我提供的示例应该可以工作,但类和方法现在已经过时了。使用 System.Xml.Xsl.XslCompiledTransform 应该为您提供解决此问题所需的内容,并且看起来好像可以传递 XmlReader 和 XmlWriter 类,因为它是读取和写入参数。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多