2011-03-15 90 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