【问题标题】:XML file parsing using LINQ使用 LINQ 解析 XML 文件
【发布时间】:2012-01-24 22:39:35
【问题描述】:

我需要根据某些字段值从 xml 文件中提取数据。 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 和特定版本匹配的报告,然后获取相关字段 acel、decel、left、right 等。

例如,我需要查找 ID 1234 和 1.0 版的报告,并且所有字段值都为 80、50 等。任何帮助都很棒。我的代码已经返回 ID 和版本,但是我无法根据版本和 ID 获取字段的所有值。

谢谢。

【问题讨论】:

标签: c# xml linq file parsing


【解决方案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()

           });

【讨论】:

    【解决方案2】:

    给你一个提示:

    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 节点并将它们过滤到与 ID1234 匹配的节点 - 这让我们得到了您示例中的第一个。接下来,我们查询此报告中的所有field 节点,并根据字段值提取新对象。看起来简单很棒?真的!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-13
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      相关资源
      最近更新 更多