2012-01-24 76 views
1

我需要根據某些字段值從XML文件中提取數據。 xml文件設置這樣使用LINQ的XML文件解析

<main> 
<report> 
    <version>1.0</version> 
    <ID>1234</ID> 
    <field> 
    <acel>80</acel> 
    <decel>50</decel> 
    <left>20</left> 
    <right>10</right> 
    <category>1-10</category> 
    </field> 
    <field> 
    <acel>30</acel> 
    <decel>54</decel> 
    <left>12</left> 
    <right>13</right> 
    <category>10-20</category> 
    </field> 
    <field> 
    <acel>34</acel> 
    <decel>210</decel> 
    <left>27</left> 
    <right>9</right> 
    <category>20-30</category> 
    </field> 
</report> 
<report> 
.... 
</report> 
</main> 

目前,我有以下幾點:

var query = doc.Descendants("report") 
      .Select(raw => new 
      { 
       version = (string)raw.Element("version"), 
       tcid = (string)raw.Element("id"), 
       forces = raw.Element("field").Elements("acel").Select(acel => (int)acel).ToList() 

      }); 

我需要在文件中搜索匹配特定的ID和特定版本的報告,然後拿到accsociated領域acel,decel,left,right等

ex我需要找到ID 1234和版本1.0的報告,並且具有所有字段值80,50等。任何幫助都很好。我有代碼已經返回ID和版本,但我無法獲得基於版本和ID的字段的所有值。

謝謝。

+0

有相當的做的這一切,有很多的樣品良好的文檔: - http://msdn.microsoft.com/en-us/library/bb387061。 ASPX –

回答

0

爲了給你一個提示:

var xDoc = XDocument.Parse(xml); 
var fields = xDoc 
    .Descendants("report") 
    .Where(r => (int)r.Element("ID") == 1234) 
    .Elements("field") 
    .Select(f => new 
     { 
      Acel = f.Element("acel").Value, 
      Decel = f.Element("decel").Value, 
     } 
    ); 

我們第一次提取report節點和過濾那些匹配的1234ID的那些 - 這給我們留下您的示例中第一個。接下來,我們查詢此報告中的所有field節點,並基於字段值提取新對象。看起來 簡單 真棒?真的是!

1

你開始通過插入.Where()

var query = doc 
     .Descendants("report") 
     .Where(r => r.Element("version").Value == "1.0" 
        && r.Element("ID").Value == "1234") 
     .Select(raw => new 
      { 
       version = (string)raw.Element("version"), 
       tcid = (string)raw.Element("id"), 
       forces = raw.Element("field").Elements("acel") 
          .Select(acel => (int)acel).ToList() 

      });