2013-04-04 53 views
0

也許某人可以幫助解決我遇到的問題。我有這個XML數據:LINQ根據值加載特定的XML數據

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<data> 
<header> 
    <version>3.1</version> 
    <date>2013-04-02</date> 
    <filedate>2013-04-02</filedate> 
</header> 
<value> 
    <TypeId>67772764</TypeId> 
    <ServiceID>GN1600</ServiceID> 
    <EvbAsof>2013-04-02</EvbAsof> 
    <Rating>2</Rating> 
    <AdditionalColumns> 
     <Name>EvbAvg</Name> 
     <Value>7.29495</Value> 
    </AdditionalColumns> 
    <AdditionalColumns> 
     <Name>EvbHigh</Name> 
     <Value>12.46</Value> 
    </AdditionalColumns> 
    <AdditionalColumns> 
     <Name>EvbLow</Name> 
     <Value>2.88563</Value> 
    </AdditionalColumns> 
    <AdditionalColumns> 
     <Name>EvbBench</Name> 
     <Value>1.86241</Value> 
    </AdditionalColumns> 
</value> 

... ...

我需要提取以下數據,作爲一組,對每個節點:

  • 來自標題節點的日期
  • 類型ID
  • 服務ID
  • 評級
  • EvbAvg值從AditionalColumns
  • EvbBench值從AditionalColumns

我設法得到TYPEID,服務ID和評價,但我只是無法弄清楚如何獲得之日起來自AditionalColumns節點的頭部和EvbAvg和EvbBench全部在相同的查詢中。 這是我到目前爲止的代碼:

var ServiceDesc = from c in XElement.Load("download.xml").Elements("value") 
         select new 
         { 
          TypeID = c.Element("TypeId").Value, 
          ServiceID = c.Element("ServiceID").Value, 
          Rating = c.Element("Rating").Value 
         } 

如果有人能幫助我,我會感激inifinitely。 非常感謝!

回答

0

假設你有一個單一的header單元和一個單一的value單元,將它們作爲集合訪問的目的可能很小(如果每個單元有多個實例,我們如何匹配它們?)。

你可以簡單地嘗試一些如下:

var doc = XElement.Load("download.xml"); 
var header = doc.Elements("header").Single(); 
var val = doc.Elements("value").Single(); 

var serviceDesc = new 
{ 
    Date = DateTime.Parse(header.Element("date").Value, 
         System.Globalization.CultureInfo.InvariantCulture), 
    TypeID = val.Element("TypeId").Value, 
    ServiceID = val.Element("ServiceID").Value, 
    Rating = val.Element("Rating").Value, 
    EbvAvg = val.Descendants("AdditionalColumns") 
       .Where(node => node.Descendants("Name").Single().Value == "EvbAvg") 
       .Select(node => node.Descendants("Value").Single().Value) 
       .Single(), 
    EbvBench = val.Descendants("AdditionalColumns") 
       .Where(node => node.Descendants("Name").Single().Value == "EvbBench") 
       .Select(node => node.Descendants("Value").Single().Value) 
       .Single()     
}; 
+0

非常感謝,但我實際上有一個HEADER和多個VALUE元素。它也證明了一些XML文件將缺少一些元素(bar HEADER),所以我需要一個驗證規則在缺少元素的結果中插入「No Data」。它變得越來越困難。謝謝! – George 2013-04-10 11:21:31

0

最後,我設法文件的供應商更改格式更友好的方式。謝謝大家!