使用LINQ-to-XML API创建XML

Vai*_*ain 0 .net xml linq linq-to-entities

我想创建一个看起来像的XML

<Records FileUniqueId="1234567" Source="CCC">
  <Record InfNumber="122354" AgencyNumber="017"></Record>
  <Record InfNumber="122355" AgencyNumber="018"></Record>
 <Record InfNumber="122356" AgencyNumber="018"></Record>
</Records>
XElement responseXML = new XElement("Records");
                responseXML.SetAttributeValue(BusinessConstants.colFileUniqueID, _fileUniqueId);
                responseXML.SetAttributeValue(BusinessConstants.colSourceName, _sourceName);

                foreach (InfringementEntity ie in iLES.infringementEntities)
                {
                    responseXML.Add(new XElement("Record"));
                    XElement record = responseXML.Element("Record");

                    record.SetAttributeValue(BusinessConstants.colInfringementNumber, ie.infringementNumber);
                    record.SetAttributeValue(BusinessConstants.colIssueAgency, ie.issueAgency);
                }
Run Code Online (Sandbox Code Playgroud)

我使用上面的代码生成XML,但问题是当我为Record设置属性时,它会每次覆盖1st记录的属性.

所以我得到的XML是:

 <Records FileUniqueId="1234567" Source="CCC">
     <Record InfNumber="122356" AgencyNumber="018"></Record>
      <Record/>
      <Record/>
    </Records>
Run Code Online (Sandbox Code Playgroud)

请帮忙.

Jon*_*eet 5

是的,它覆盖了第一条记录的属性,因为你告诉它 - 你没有使用你刚刚创建的Record元素.你可以这样做:

foreach (InfringementEntity ie in iLES.infringementEntities)
{
    XElement newRecord = new XElement("Record");
    newRecord.SetAttributeValue(BusinessConstants.colInfringementNumber,
                                ie.infringementNumber);
    newRecord.SetAttributeValue(BusinessConstants.colIssueAgency,
                                responseXML.Add(newRecord);
}
Run Code Online (Sandbox Code Playgroud)

......但是有更多惯用的方法,例如:

XElement responseXML = new XElement("Records",
    iLes.infringementEntities.Select(ie => new XElement("Record",
        new XAttribute(BusinessConstants.colInfringementNumber,
                       ie.infringementNumber),
        new XAttribute(BusinessConstants.colIssueAgency, ie.issueAgency))));
Run Code Online (Sandbox Code Playgroud)

这取代了整个代码,包括foreach声明.