2011-03-15 53 views
0

我有以下的后代:如何访问该的XDocument与XML LINQ

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

回答

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", 
+0

这给了我一个对象未​​设置为对象的异常 – user380432 2011-03-15 17:44:39

+0

的实例上面的代码工作为我测试的使用匿名类和删除不存在的属性,这些属性您正在使用。你必须有一个预先存在的'_dataPoint'变量,当然这个变量初始化为一个类型为'List '的空列表。 – BrokenGlass 2011-03-15 17:52:43

0

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 
             })); 
+0

只需获取属性?资产,ESN,经度等 – user380432 2011-03-15 17:37:58

+0

呃,就我所知,这不是它所做的。仔细查看文档中的示例代码,它会过滤属性名称,而不是元素名称。 http://msdn.microsoft.com/en-us/library/bb341024.aspx – Lucero 2011-03-15 17:43:52