Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/339.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中创建元素的频率计数#_C#_Xml_Optimization_Datatable_Xmlreader - Fatal编程技术网

C# 读取XML并在C中创建元素的频率计数#

C# 读取XML并在C中创建元素的频率计数#,c#,xml,optimization,datatable,xmlreader,C#,Xml,Optimization,Datatable,Xmlreader,我有一个这种格式的XML文件(但只大得多): 我还准备将XmlReader类更改为任何其他更有效的类来完成此任务。欢迎任何建议。试试这个逻辑,目前我在这里只取了一个属性,即名称 您可以使用以下代码: using (XDocument xdoc = XDocument.Load(@"C:\Users\aks\Desktop\sample.xml")) { var customers = xdoc.Descendants("customer");

我有一个这种格式的XML文件(但只大得多):


我还准备将XmlReader类更改为任何其他更有效的类来完成此任务。欢迎任何建议。

试试这个逻辑,目前我在这里只取了一个属性,即名称


您可以使用以下代码:

    using (XDocument xdoc = XDocument.Load(@"C:\Users\aks\Desktop\sample.xml"))
        {
            var customers = xdoc.Descendants("customer");
            var totalNodes = customers.Count();

            var filledNames = customers.Descendants("name").Where(x => x.Value != string.Empty).Count();
            var filledAges = customers.Descendants("age").Where(x => x.Value != string.Empty).Count();
            var filledGenders = customers.Descendants("gender").Where(x => x.Value != string.Empty).Count();

            var unfilledNames = totalNodes - filledNames;
            var unfilledAges = totalNodes - filledAges;
            var unfilledGenders = totalNodes - filledGenders;
        }

事实证明,使用Select操作在DataTable中进行查询非常昂贵,这使得我的功能非常缓慢

取而代之的是,使用
字典
并在其上查询以将计数填入字典,完成后,将
字典
转换为数据表


这为我节省了大量时间并解决了问题。

我曾想过使用XDocument,但问题是它将整个XML文件加载到内存中,正如我所说的,我正在处理非常大的XML文件,所以我不愿意这样做。虽然谢谢你的帮助。。。我想使用XDocument,但问题是它将整个XML文件加载到内存中,正如我所说的,我处理的是非常大的XML文件,所以我不想这样做。虽然谢谢你的帮助。。。将使用此作为我的最后一个选项。
static void AddCount(DataTable dt)
{
     int count;
     using (XmlReader reader = XmlReader.Create(@"C:\Usr\sample.xml"))
     {
         while (reader.Read())
            {
                if (reader.IsStartElement())
                {
                    string eleName = reader.Name;
                    DataRow[] foundElements = dt.Select("ElementName = '" + eleName + "'");  
                    if (!reader.IsEmptyElement)
                    {
                       count = int.Parse(foundElements.ElementAt(0)["Frequency"].ToString());  
                       foundElements.ElementAt(0).SetField("Frequency", count + 1);
                    }
                    else
                    {
                       count = int.Parse(foundElements.ElementAt(0)["Frequency"].ToString());  
                       foundElements.ElementAt(0).SetField("Frequency", count + 1);
                    }
                }
            }   
       }   
  }    
        XDocument xl = XDocument.Load(@"C:\Usr\sample.xml");
        var customers = xl.Descendants("Customer");
        var customerCount = customers.Count();
        var filledCustomers = customers.Where(x => x.Element("Name").Value != string.Empty).Count();
        var nonfilledCustomers = customerCount - filledCustomers;
    using (XDocument xdoc = XDocument.Load(@"C:\Users\aks\Desktop\sample.xml"))
        {
            var customers = xdoc.Descendants("customer");
            var totalNodes = customers.Count();

            var filledNames = customers.Descendants("name").Where(x => x.Value != string.Empty).Count();
            var filledAges = customers.Descendants("age").Where(x => x.Value != string.Empty).Count();
            var filledGenders = customers.Descendants("gender").Where(x => x.Value != string.Empty).Count();

            var unfilledNames = totalNodes - filledNames;
            var unfilledAges = totalNodes - filledAges;
            var unfilledGenders = totalNodes - filledGenders;
        }