Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.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 - Fatal编程技术网

C# 读取大型xml文件会使服务器停止工作—内存不足

C# 读取大型xml文件会使服务器停止工作—内存不足,c#,xml,C#,Xml,我有一段代码,可以很好地用于普通文件。但是对于非常大的文件,它会使服务器停止工作 这是: XmlReader reader = null; try { reader = XmlReader.Create(file_name + ".xml"); XDocument xml = XDocument.Load(reader); XmlNamespaceManager namespaceManager = GetNamespaceManager(reader); XEl

我有一段代码,可以很好地用于普通文件。但是对于非常大的文件,它会使服务器停止工作

这是:

XmlReader reader = null;
try
{
    reader = XmlReader.Create(file_name + ".xml");
    XDocument xml = XDocument.Load(reader);
    XmlNamespaceManager namespaceManager = GetNamespaceManager(reader);
    XElement root = xml.Root;

    //XAttribute supplier = root.XPathSelectElement("//sh:Receive/sh:Id", namespaceManager).Attribute("Authority");

    //string version = root.XPathSelectElement("//sh:DocumentId/sh:Version", namespaceManager).Value;

    var nodes = root.XPathSelectElements("//eanucc:msg/eanucc:transact", namespaceManager);

    return nodes;                
}
catch
{ }

我认为这是导致服务器内存问题的原因。如何修复此问题?

尝试将读取器放入using(){}子句中,以便在使用后将其处理掉

try
{
    using(var reader = XmlReader.Create(file_name + ".xml"))
    {
      XDocument xml = XDocument.Load(reader);
      XmlNamespaceManager namespaceManager = GetNamespaceManager(reader);
      XElement root = xml.Root;

      var nodes = root.XPathSelectElements("//eanucc:msg/eanucc:transact", namespaceManager);

      return nodes;
    }                
}
catch
{ } 

听起来好像一次读取的数据太多了。您必须一次迭代一个元素,使用
XmlReader
作为光标,一次将一个元素转换为
XElement

public static IEnumerable<XElement> ReadTransactions()
{
    using (var reader = XmlReader.Create(file_name + ".xml"))
    {
        while (reader.ReadToFollowing("transact", eanuccNamespaceUri))
        {
            using (var subtree = reader.ReadSubtree())
            {
                yield return XElement.Load(subtree);
            }
        }
    }
}
公共静态IEnumerable ReadTransactions()
{
使用(var reader=XmlReader.Create(文件名+“.xml”))
{
while(reader.readtofollow(“transact”,eanuccNamespaceUri))
{
使用(var subtree=reader.ReadSubtree())
{
收益率-收益率-负荷(子树);
}
}
}
}
注意:这假设在任何其他级别都不存在“transact”元素。如果有,您需要更加小心地使用
XmlReader
,而不仅仅是调用
readtofollow
。还要注意,您需要找到
eanucc
别名的实际名称空间URI


不要忘记,如果您尝试一次性读取所有这些信息(例如,通过调用
ToList()
),那么您的内存仍然会不足。您需要流式传输信息。(不清楚您打算如何处理这些元素,但您需要仔细考虑。)

在您的答案中添加更多细节。避免一行/简短的回答。回答时不要问问题,使用注释。有多少个
transact
元素?(这甚至可能不可行…)您能告诉我们导致错误的文件大小吗?是单个文件还是多个大文件?@Jras是单个文件。它有大约8000个节点。好的,所以基本上你试图读取的数据超过了你的内存容量。那是行不通的。我猜想,您必须使用迭代器块。@petko_stankoski:看到我的答案了吗。但是你也应该阅读迭代器块来理解它,我试图计算它们,以找出文件中有多少transact元素。我如何调用ReadTransactions()?@petko_stankoski:如果你只是想计算它们,你根本不需要加载它们。我希望你以前说过。也就是说,您可以始终使用
int count=ReadTransactions.count()Tnx,你真的帮了大忙。但是reader.ReadSubtree()返回空。@petko_stankoski:“返回空”是什么意思?你想用它做什么?没有给出XML的示例是没有帮助的。