【问题标题】:How to access this XDocument with XML LINQ如何使用 XML LINQ 访问此 XDocument
【发布时间】:2011-03-15 17:33:47
【问题描述】:

我有以下后代:

  <ReportItem Asset="111" ESN="111" Longitude="123" Latitude="123" MessageTime="2/16/2011" MessageTimeZone="CST" MessageTimeZoneGMTOffset="-360" SpeedUnit="Mph" Speed="111" Direction="West" Address="test" Name="testing" /> 

在同一个 XDocument 中有多个,但我正在循环使用以下内容:

IEnumerable<XElement> elements = XData.Descendants("ReportItem");

                foreach (XElement element in elements)

然后我尝试将这些分配给包含相同名称的业务对象类。 我想知道为什么这根本不分配它们:

 foreach (XElement element in elements)
            {
                _dataPoints.AddRange((from datapoint in elements.Attributes("ReportItem")
                                      select new DataPoint()
                                      {
                                          Asset = element.Attribute("Asset").Value,
                                          ESN = element.Attribute("ESN").Value,
                                          Longitude = element.Attribute("Longitude").Value,
                                          Latitude = element.Attribute("Latitude").Value,
                                          MessageTime = element.Attribute("MessageTime").Value,
                                          MessageTimeZone = element.Attribute("MessageTimeZone").Value,
                                          MessageTimeZoneGMTOffset = element.Attribute("MessageTimeZoneGMTOffset").Value,
                                          MinutesIdle = element.Attribute("MinutesIdle").Value,
                                          Address = element.Attribute("Address").Value,
                                          Name = element.Attribute("Name").Value,
                                          TripDistance = element.Attribute("TripDistance").Value,
                                          TripDistanceUnit = element.Attribute("TripDistanceUnit").Value,
                                      }).ToList());
            }
        }

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    您使用了错误的变量 - 您应该使用范围变量,但您使用的是外部循环变量。

    所以这个:

    select new DataPoint()
    {
       Asset = element.Attribute("Asset").Value,
       ..
    

    应该是

    select new DataPoint()
    {
      Asset = datapoint.Attribute("Asset").Value,
      ..
    

    此外,您首先不需要外部循环,内部 LINQ 查询会遍历一个不存在的属性 - 整个事情应该是:

    _dataPoints.AddRange((from datapoint in elements
                            select new DataPoint()
                            {
                                Asset = datapoint.Attribute("Asset").Value,
                                ESN = datapoint.Attribute("ESN").Value,
                                Longitude = datapoint.Attribute("Longitude").Value,
                                Latitude = datapoint.Attribute("Latitude").Value,
                                MessageTime = datapoint.Attribute("MessageTime").Value,
                                MessageTimeZone = datapoint.Attribute("MessageTimeZone").Value,
                                MessageTimeZoneGMTOffset = datapoint.Attribute("MessageTimeZoneGMTOffset").Value,
                                MinutesIdle = datapoint.Attribute("MinutesIdle").Value,
                                Address = datapoint.Attribute("Address").Value,
                                Name = datapoint.Attribute("Name").Value,
                                TripDistance = datapoint.Attribute("TripDistance").Value,
                                TripDistanceUnit = datapoint.Attribute("TripDistanceUnit").Value,
                            }).ToList());
    

    还请注意,您使用的属性甚至没有在 XML 中定义(即MinutesIdleTripDistanceTripDistanceUnit)。在这种情况下,您要么测试并处理 null,要么从 DataPoint 类中删除它们。处理 null 的一个例子是:

     MinutesIdle = (string)datapoint.Attribute("MinutesIdle") ?? "0",
    

    【讨论】:

    • 这给了我一个未设置为对象异常实例的对象
    • 以上代码适用于我使用匿名类测试并删除您正在使用的不存在的属性。当然,您必须使用 List&lt;DataPoint&gt; 类型的空列表初始化一个预先存在的 _dataPoint 变量。
    【解决方案2】:

    你的代码中的elements.Attributes("ReportItem")应该做什么?

    我想你真正想要的是这个:

    _dataPoints.AddRange(XData.Descendants("ReportItem").Select(element => 
                                          select new DataPoint(){
                                              Asset = element.Attribute("Asset").Value,
                                              ESN = element.Attribute("ESN").Value,
                                              Longitude = element.Attribute("Longitude").Value,
                                              Latitude = element.Attribute("Latitude").Value,
                                              MessageTime = element.Attribute("MessageTime").Value,
                                              MessageTimeZone = element.Attribute("MessageTimeZone").Value,
                                              MessageTimeZoneGMTOffset = element.Attribute("MessageTimeZoneGMTOffset").Value,
                                              MinutesIdle = element.Attribute("MinutesIdle").Value,
                                              Address = element.Attribute("Address").Value,
                                              Name = element.Attribute("Name").Value,
                                              TripDistance = element.Attribute("TripDistance").Value,
                                              TripDistanceUnit = element.Attribute("TripDistanceUnit").Value
                                          }));
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2012-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多