Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 转换大型Xml文件_C#_Xml_Xslt_Out Of Memory - Fatal编程技术网

C# 转换大型Xml文件

C# 转换大型Xml文件,c#,xml,xslt,out-of-memory,C#,Xml,Xslt,Out Of Memory,我使用这个扩展方法用xslt转换非常大的xml文件 不幸的是,我在source.ToString()行中遇到了OutOfMemoryException 我意识到一定有更好的方法,我只是不确定那会是什么 public static XElement Transform(this XElement source, string xslPath, XsltArgumentList arguments) { var doc = new XmlDocument(); doc

我使用这个扩展方法用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());
            }
        }
}
想法?解决?等等

更新: 现在这个问题已经解决了,我在验证模式时遇到了问题! 试试这个:

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;
    }
}

顺便说一句,
newXMLTextWriter()
从.NET2.0开始就不推荐使用。改用
XmlWriter.Create()
。与
new XmlTextReader()
XmlReader.Create()

相同,对于大型XML文件,您可以按照中的建议尝试使用XPathDocument


有多大是非常大?我已经找到了正在更改的doc.LoadXml(source.ToString());到doc.Load(source.CreateReader());帮助…不确定它的限制是什么。@Rob Goodwin,50MB,这只有一条记录…很可能这会有更多记录。最大的问题是你同时有一个XElement和一个XmlDocument——如果你只使用XmlDocument,这是你需要的内存的两倍。我的建议是不要使用LINQ(或者在创建XmlDocument之前以某种方式除去LINQ对象)。使用XPathDocument代替XmlDocument也会有所帮助。谢谢,这非常有用!我添加了一个与验证(xsd)相关的后续问题
XPathDocument srcDoc = new XPathDocument(srcFile);
XslCompiledTransform myXslTransform = new XslCompiledTransform();
myXslTransform.Load(xslFile);
using (XmlWriter destDoc = XmlWriter.Create(destFile))
{
    myXslTransform.Transform(srcDoc, destDoc);
}