【问题标题】:Grouping of Xml Elements using Linq使用 Linq 对 Xml 元素进行分组
【发布时间】:2012-10-16 07:44:22
【问题描述】:

我有以下 xml。我需要做的是,我想使用他们的 locid 使用 linq 在每个表中 group 行。

<taxdata schema="3" nextrowid="812" timesaved="0" calcmode="1" calcneeded="0">
  <table name="aatbl_entity" id="1" ver="102" ddtime="11-10-2012 17:57:08" locs="" /> 
  <table name="aatbl_entityactivity" id="2" ver="102" ddtime="11-10-2012 17:57:08" locs="" key0="2">
        <row name="" locid="100" rows="71" rowid="71" Ks0="1"> </row>
        <row name="" locid="48" rows="52" rowid="52" Ks0="8"> </row>
        <row name="" locid="6148" rows="216" rowid="216" Ks0="16"> </row>
        <row name="" locid="6148" rows="217" rowid="217" Ks0="17"> </row>
        <row name="" locid="6148" rows="218" rowid="218" Ks0="18">  </row>
        <row name="" locid="6154" rows="219" rowid="219" Ks0="19">  </row>
        <row name="" locid="6154" rows="220" rowid="220" Ks0="20">  </row>
        <row name="" locid="6154" rows="221" rowid="221" Ks0="21">  </row>
        <row name="" locid="6154" rows="222" rowid="222" Ks0="22">  </row>
        <row name="" locid="6154" rows="223" rowid="223" Ks0="23">  </row>
        <row name="" locid="6209" rows="224" rowid="224" Ks0="24">  </row>
        <row name="" locid="6127" rows="233" rowid="233" Ks0="32">   </row>
        <row name="" locid="6127" rows="234" rowid="234" Ks0="33">  </row>
        <row name="" locid="6127" rows="235" rowid="235" Ks0="34">  </row>
        <row name="" locid="36" rows="236" rowid="236" Ks0="35">  </row>
        <row name="" locid="36" rows="244" rowid="244" Ks0="43">  </row>
        <row name="" locid="111" rows="266" rowid="266" Ks0="51">  </row>
        <row name="" locid="111" rows="752" rowid="752" Ks0="59">  </row>
        <row name="" locid="6192" rows="361" rowid="361" Ks0="55">  </row>
        <row name="" locid="10" rows="810" rowid="810" Ks0="60"> </row>
        <row name="" locid="10" rows="811" rowid="811" Ks0="61"> </row>
        <row name="" locid="10" rows="812" rowid="812" Ks0="62">  </row>
  </table> 
 <table name="aatbl_entityactivitydetail" id="13" ver="102" ddtime="11-10-2012 17:57:09" locs="" key0="2" key1="5">
        <row name="" locid="6327" rows="90" rowid="90" Ks0="1" Ks1="1">  </row>
        <row name="" locid="6327" rows="104" rowid="104" Ks0="1" Ks1="2">  </row>
        <row name="" locid="6327" rows="118" rowid="118" Ks0="1" Ks1="3">  </row>
        <row name="" locid="6327" rows="133" rowid="133" Ks0="1" Ks1="4">  </row>
        <row name="" locid="6327" rows="522" rowid="522" Ks0="3" Ks1="1">  </row>
        <row name="" locid="6327" rows="529" rowid="529" Ks0="3" Ks1="2">  </row>
        <row name="" locid="6327" rows="536" rowid="536" Ks0="3" Ks1="3">  </row>
        <row name="" locid="6327" rows="543" rowid="543" Ks0="3" Ks1="4">  </row>
        <row name="" locid="101" rows="177" rowid="177" Ks0="1" Ks1="5">  </row>
        <row name="" locid="101" rows="563" rowid="563" Ks0="3" Ks1="5">  </row>
        <row name="" locid="105" rows="185" rowid="185" Ks0="1" Ks1="6">  </row>
        <row name="" locid="105" rows="564" rowid="564" Ks0="3" Ks1="6">  </row>
        <row name="" locid="106" rows="186" rowid="186" Ks0="1" Ks1="7">  </row>
        <row name="" locid="106" rows="565" rowid="565" Ks0="3" Ks1="7">  </row>
        <row name="" locid="106" rows="2" rowid="2" Ks0="3" Ks1="7"> </row>
  </table>
  <table name="aatbl_entityactivityasset" id="14" ver="102" ddtime="11-10-2012 17:57:09" locs="" key0="2" key1="9" 
</taxdata>

我试过跟着bur没用,

const string filePath = @"D:\XJH\11-10-2012_17_57_08.xml";

XDocument doc = XDocument.Load(filePath);

var tableIds =
    doc
        .Descendants("table")
        .Select(table => new { id = table.Attributes("id").ToString() });

foreach (var id in tableIds)
{
   var rowgroups =doc.Descendants("table")
                     .Elements()
                     .Where(row => row.Ancestors()
                            .Attributes("id").ToString() == id.ToString())
                     .GroupBy(row => new { ids = row.Attributes("locid") })
                     .Select(row => row);
}

不知道这种分组方式是否正确,请帮忙....

【问题讨论】:

  • 不要混用 foreach 和 LINQ。你能告诉我们输出应该是什么样子吗?
  • 格式化代码时,请注意横向滚动有点痛苦——巨大的单行很烦人,因此我重新格式化了代码。
  • 请注意,您已经在循环中声明了一个变量,但没有使用它——您怎么知道它“不起作用”?
  • 实际上我正在调试...并且表格 ID 没有被填充...
  • @Enigmativity:我想根据每个表的 locid 计算每个表中的行数......因此我想对它们进行分组

标签: c# asp.net xml linq grouping


【解决方案1】:

尝试以这种方式替换您的代码:

string[] tableIds = doc.Descendants("table").Select(t => t.Attribute("id").Value).ToArray<string>();

foreach (var id in tableIds)
{
    var rowgroups = doc.Descendants("table").Elements()
        .Where(row => row.Parent.Attribute("id").Value.Equals(id))
        .GroupBy(row => row.Attribute("locid").Value)
        .Select(row => row);
    // ... do something ...
    // Here you will have all the Grouped XElements in rowgroups
}

【讨论】:

    【解决方案2】:

    这是你想要的吗:

    var query =
        from xe in doc.Element("taxdata").Elements("table")
        from gr in xe.Elements("row").GroupBy(_ => _.Attribute("locid").Value)
        select new
        {
            id = xe.Attribute("id").Value,
            locid = gr.Key,
            rows = gr.Count(),
        };
    

    我得到以下结果:

    【讨论】:

      【解决方案3】:

      你可以试试这个,我觉得可行:

      var xe = doc.Descendants("table")
                  .Elements("row")
                  .GroupBy(a => a.Attribute("locid").Value)
                  .Select(a => new { Value = a.Key, Count = a.Count() });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多