水平太差,虽然认为Linq是个好东东,但有谁能教教我,怎么调试?

想做个通过XML做配置的方案,使用Linq
<?xml version="1.0" encoding="utf-8"?>
<root>
    
<schedules>
        
<idle>3600000</idle>
        
<schedule>
            
<dic>e:\</dic>
            
<schedulename>dhdp</schedulename>
            
<configfile>dhdpconfig.xml</configfile>
        
</schedule>
        
<schedule>
            
<dic>e:\</dic>
            
<schedulename>logdhdp</schedulename>
            
<configfile>logdhdpconfig.xml</configfile>
        
</schedule>
    
</schedules>
</root>
class Schedule 
    {
        
public string dic { getset; }
        
public string schedulename { getset; }
        
public string configfile { getset; }
    }
    
class Schedules
    {
        
public int Idle { getset; }
        
public List<Schedule> ScheduleList { getset; }        
    }
    class Program
    {
        
static void Main(string[] args)
        {
            
            var xmlfn 
= @"Schedules.xml";        
            TestScheduleList(xmlfn);
            TestSchedulesList(xmlfn);
            TestSchedulesList2(xmlfn);
            Console.ReadKey();
        }
        
public static void TestScheduleList(string xmlfn)
        {
            XElement SchedulesXml 
= XElement.Load(xmlfn);

            List
<Schedule> ScheduleList = (
                from ScheduleElement 
in SchedulesXml.Elements("schedules").Descendants("schedule")
                select 
new Schedule
                {
                    dic 
= ScheduleElement.Element("dic").Value,
                    schedulename 
= ScheduleElement.Element("schedulename").Value,
                    configfile 
= ScheduleElement.Element("configfile").Value                   
                }
            ).ToList();
            Console.WriteLine(
"测试ScheduleList");
            
foreach (var sc in ScheduleList)
            {
                Console.WriteLine(sc.configfile);
            }
            Console.ReadKey();
        }
        
public static void TestSchedulesList(string xmlfn)
        {
            XElement SchedulesXml 
= XElement.Load(xmlfn);
            var SchedulesList 
= from SchedulesElement in SchedulesXml.Elements("schedules")
                                select SchedulesElement;
            Console.WriteLine(
"测试SchedulesList");
            
foreach (var scs in SchedulesList)
            {
                Console.WriteLine(scs.Value);
            }
            Console.ReadKey();
        }
        
public static void TestSchedulesList2(string xmlfn)
        {
            XElement SchedulesXml 
= XElement.Load(xmlfn);
            var SchedulesList 
= from SchedulesElement in SchedulesXml.Elements("schedules")
                                select 
new Schedules
                                {
                                    Idle 
= (int)SchedulesElement.Element("Idle"),
                                    ScheduleList 
= (
                                        from ScheduleElement 
in SchedulesElement.Descendants("schedule")
                                        select 
new Schedule
                                        {
                                            dic 
= ScheduleElement.Element("dic").Value,
                                            schedulename 
= ScheduleElement.Element("schedulename").Value,
                                            configfile 
= ScheduleElement.Element("configfile").Value                                           
                                        }
                                     ).ToList()
                                };
            Console.WriteLine(
"测试SchedulesList");
            
foreach (var scs in SchedulesList)
            {
                Console.WriteLine(scs.ScheduleList.ToString());
            }
            Console.ReadKey();
        }
    }
 
 

在使用TestSchedulesList2有错误,不知怎样调试,错误如下:

未处理 System.ArgumentNullException
  Message="值不能为空。\r\n参数名: element"
  Source="System.Xml.Linq"
  ParamName="element"
  StackTrace:
       在 System.Xml.Linq.XElement.op_Explicit(XElement element)
       在 ConsoleApplication1.Program.<TestSchedulesList2>b__7(XElement SchedulesElement) 位置 D:\web\ConsoleApplication1\ConsoleApplication1\Program.cs:行号 170
       在 System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
       在 ConsoleApplication1.Program.TestSchedulesList2(String xmlfn) 位置 D:\web\ConsoleApplication1\ConsoleApplication1\Program.cs:行号 186
       在 ConsoleApplication1.Program.Main(String[] args) 位置 D:\web\ConsoleApplication1\ConsoleApplication1\Program.cs:行号 129
       在 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       在 System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       在 System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       在 System.Threading.ThreadHelper.ThreadStart()
  InnerException:

经过大家的提醒,终于找到原因了,XML是要区分大小写的,我将idle写成了Idle了,改后运行正常了。

public static void TestSchedulesList2(string xmlfn)
        {
            XElement SchedulesXml 
= XElement.Load(xmlfn);
            var SchedulesList 
= from SchedulesElement in SchedulesXml.Elements("schedules")
               select 
new Schedules
                {
                    Idle 
= int.Parse(SchedulesElement.Element("idle").Value),
                    ScheduleList 
=
                        (from ScheduleElement 
in SchedulesElement.Descendants("schedule")
                            select 
new Schedule
                            {
                                dic 
= ScheduleElement.Element("dic").Value,
                                schedulename 
= ScheduleElement.Element("schedulename").Value,
                                configfile 
= ScheduleElement.Element("configfile").Value
                             
}
                         ).ToList()
                };
            Console.WriteLine(
"测试SchedulesList");
            
foreach (var scs in SchedulesList)
            {
                Console.WriteLine(scs.ScheduleList[
0].schedulename);
            }
            Console.ReadKey();
        }


 

原文地址:https://www.cnblogs.com/GDLMO/p/1987099.html