<List> 到 XML 与 Linq c#

<List> to XML with Linq c#

我已经将一个糟糕的文档解析成一个列表,但我在使用 Linq 格式化它时遇到问题,而且似乎无法完全正确。

我的代码如下所示:

var xEle = new XElement("WorkOrder",
           from item in items 
           select new XElement(item.SECTION,
                      new XElement(item.DATANAME, item.DATAVALUE)));

产生这样的东西:

      <WorkOrder>
      <JOBDETAILS>
        <JOBNUMBER>12345</JOBNUMBER>
      </JOBDETAILS>
      <JOBDETAILS>
        <ACTIVITYNO>/01</ACTIVITYNO>
      </JOBDETAILS>
      <JOBDETAILS>
        <JOBCCD>15/06/2015
    </JOBCCD>
      </JOBDETAILS>
      <JOBDETAILS>
        <REQUIRED>15/06/2016
    </REQUIRED>
      </JOBDETAILS>
      <COMPANYDETAILS>
        <COMPANY>Adventure Works
    </COMPANY>
      </COMPANYDETAILS>
      <COMPANYDETAILS>
        <STREET>LTD
    </STREET>
      </COMPANYDETAILS>
      <COMPANYDETAILS>
        <LOCALITY>123 Street
    </LOCALITY>
      </COMPANYDETAILS>
      <COMPANYDETAILS>
        <TOWN>Local Town
    </TOWN>
      </COMPANYDETAILS>
      <COMPANYDETAILS>
        <COUNTY>County Name
    </COUNTY>
      </COMPANYDETAILS>
      <COMPANYDETAILS>
        <POSTCODE>ABC 1234
    </POSTCODE>
<COMMENTS>
    <COMMENT>this is a comment</COMMENT>
</COMMENTS>
</WorkOrder>

我试图让它按我的 item.SECTION 分组(在示例输出中这将是 JOBDETAILS & COMPANYDETAILS),我想生成这样的东西:

<WorkOrder>
   <JOBDETAILS>
         <JOBNUMBER>12345</JOBNUNMBER>
         <ACTIVITYNO>/01</ACTIVITYNO>
         <JOBCCD>15/06/2015</JOBCCD>
         <REQUIRED>15/06/2016</REQUIRED>
   </JOBDETAILS>
   <COMPANYDETAILS>
         <COMPANY>Adventure Works</COMPANY>
         <STREET>LTD</STREET>
         <LOCALITY>123</LOCALITY>
   </COMPANYDETAILS>
   <COMMENTS>
         <COMMENT>THIS IS A COMMENT</COMMENT>
   </COMMENTS>
</WorkOrder>

我的列表是动态的,每次都不包含一组特定的字段,因此我没有对输出进行硬编码。

我不认为我在一百万英里之外,希望能向正确的方向踢球。

您需要添加一个 groupby 以按部分对结果进行分组。

var xEle =
    new XElement("WorkOrder",
       from item in items 
       group item by item.SECTION into g
       select new XElement(g.Key,
                  g.Select(i => new XElement(i.DATANAME, i.DATAVALUE))));

请注意,您还需要两次选择,一次构建元素列表,另一次将它们组合在一起。 (请注意,我使用函数语法,你也可以说 from i in g select 的变体)