循环遍历XML元素以添加数据

时间:2013-05-03 13:44:21

标签: c# asp.net xml

我不知道如何确切地说出我的问题,所以从前面道歉。我有一个xml文件,它包含如下元素:

- <Allow_BenGrade>
  <Amount BenListID="0">0</Amount> 
  </Allow_BenGrade>
- <Add_Earnings_NonTaxable>
  <Amount AddEarnID="0">0</Amount> 
  </Add_Earnings_NonTaxable>

我对 Allow_BenGrade 感兴趣,我可以在其中添加多个元素。我有3个项目的列表但是当我循环将其写入文件时,它只写入列表中的最后一项,因此在 Allow_BenGrade 中没有3个元素,我最终得到一个(项目列表中的最后一个)。我的代码如下。请帮忙谢谢。

var query = from nm in xelement.Elements("EmployeeFinance")
                                    select new Allowance {
                                    a_empersonalID = (int)nm.Element("EmpPersonal_Id"),
                                    a_allbengradeID = (int)nm.Element("Grade_Id")
                           };
                var x = query.ToList();


                foreach (var xEle in x)
                {
                    var qryBenListGrade = from ee in context.Employee_Employ
                                 join abg in context.All_Inc_Ben_Grade
                                 on ee.Grade_Id equals abg.GradeID
                                 join abl in context.All_Inc_Ben_Listing
                                 on abg.All_Inc_Ben_ListingID equals abl.ID
                                 where ee.Employee_Personal_InfoEmp_id == xEle.a_empersonalID && abg.GradeID == xEle.a_allbengradeID && (abl.Part_of_basic == "N" && abl.Status == "A" && abl.Type_of_earnings == 2)
                                 //abl.Approved_on !=null &&
                                 select new 
                                 {
                                        abl.ID,
                                        abl.Amount,
                                        abg.GradeID,
                                        ee.Employee_Personal_InfoEmp_id,
                                        abl.Per_Non_Taxable,
                                        abl.Per_Taxable
                                 };
                    var y = qryBenListGrade.ToList();
                    //xEle.a_Amount = 0;
                    foreach (var tt in y)
                    {
                   Debug.WriteLine("amount: " + tt.Amount + " emp id: " + tt.Employee_Personal_InfoEmp_id + " ben list id: " + tt.ID);
                       // xEle.a_Amount = xEle.a_Amount + tt.Amount;

                        var result = from element in doc.Descendants("EmployeeFinance")
                                     where int.Parse(element.Element("EmpPersonal_Id").Value) == tt.Employee_Personal_InfoEmp_id
                                     select element;
                        foreach (var ele in result)
                        {
                            ele.Element("Allow_BenGrade").SetElementValue("Amount", tt.Amount);
                            //ele.Element("Allow_BenGrade").Element("Amount").SetAttributeValue("BenListID", tt.ID);
                        }

                    }
                    doc.Save(GlobalClass.GlobalUrl);
                }

2 个答案:

答案 0 :(得分:2)

顾名思义,

SetElementValue会设置Amount元素的值...您需要添加一个新元素:

ele.Element("Allow_BenGrade").Add(new XElement("Amount", 
                                      new XAttribute("BenListID", tt.ID),
                                      tt.Amount);

如果能解决这个问题,请告诉我。

答案 1 :(得分:0)

XElement.SetElementValue Method

  

设置子元素的值,添加子元素或删除子元素   儿童元素。

此外:

  

将值分配给具有指定的第一个子元素   名称。如果不存在具有指定名称的子元素,则为新子元素   元素被添加。如果值为null,则第一个子元素为   删除指定的名称(如果有)。

     

此方法不会将子节点或属性添加到指定的位置   儿童元素。

您应该使用XElement.Add Method代替。