2012-01-24 60 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() 

      });