同样的结果,输出数据使用双Foreach循环

问题描述:

,当我需要一个字符串设定为这样的事情同样的结果,输出数据使用双Foreach循环

<Student> 
    <StudentID></StudentID> 
    <FirstName></FirstName> 
    <Fees> 
     <Fee> 
      <FeeID></FeeID> 
     </Fee> 
    </Fees> 
</Student> 
<Student> 
    <StudentID></StudentID> 
    <FirstName></FirstName> 
    <Fees> 
     <Fee> 
      <FeeID></FeeID> 
     </Fee> 
    </Fees> 
</Student> 
... and so on 

我的代码

string strFeeData = ""; // XML Content for Fees 
string strStuData = ""; // XML Content for Students with Fees 

foreach (var studentData in sorted) 
{ 
    foreach(Fee feeData in studentData.Fees) 
    { 
     strFeeData = strFeeData + "<Fee>\n\t<FeeID>" + feeData.FeeID + "</FeeID>\n\t<FeeName>" + feeData.FeeName + "</FeeName>\n\t<Amount>" + feeData.Amount + "</Amount>\n\t<DueDate>" + feeData.DueDate + "</DueDate>\n</Fee>\n"; 
    } 
    strStuData = strStuData + "<Student>\n\t<StudentID>" + studentData.StudentID + "</StudentID>\n<FirstName>" + studentData.FirstName + "</FirstName>\n<LastName>" + studentData.LastName + "</LastName>\n<Grade>" + studentData.Grade + "</Grade>\n<Fees>\n\t" + strFeeData + "</Fees></Student>\n"; 
} 

我得到了这部分正确输出

<Student> 
    <StudentID>1</StudentID> 
    <FirstName>David</FirstName> 
... 
<Student> 
    <StudentID>2</StudentID> 
    <FirstName>John</FirstName> 

但对于费用

<Fees> 
    <Fee> 
     <FeeID>12</FeeID> 
.... 
<Fees> 
    <Fee> 
     <FeeID>12</FeeID> 

我为每个学生收取了相同的费用。

我的双foreach循环出了什么问题?

(我已经选中排序的学费都有不同的价值观,这个问题必须在双foreach循环)

感谢

+1

你为什么要手工创建XML?这是一个令人难以置信的容易出错的方法。使用.NET中提供的许多XML API之一 - 理想的是LINQ to XML。 – 2013-03-13 08:03:31

+0

我还是C#初学者> user1618180 2013-03-13 08:08:04

+0

这是我能想到的唯一解决方案 – user1618180 2013-03-13 08:09:21

初始化strFeeData利用外环内空字符串:

foreach (var studentData in sorted) 
{ 
    strFeeData = ""; 

    foreach(Fee feeData in studentData.Fees) 
    { 
     strFeeData = strFeeData + "<Fee>\n\t<FeeID>" + feeData.FeeID + "</FeeID>\n\t<FeeName>" + feeData.FeeName + "</FeeName>\n\t<Amount>" + feeData.Amount + "</Amount>\n\t<DueDate>" + feeData.DueDate + "</DueDate>\n</Fee>\n"; 
    } 
    strStuData = strStuData + "<Student>\n\t<StudentID>" + studentData.StudentID + "</StudentID>\n<FirstName>" + studentData.FirstName + "</FirstName>\n<LastName>" + studentData.LastName + "</LastName>\n<Grade>" + studentData.Grade + "</Grade>\n<Fees>\n\t" + strFeeData + "</Fees></Student>\n"; 
} 

然而,使用字符串连接创建XML真的不好主意!您应该阅读关于序列化或LINQ to XML!

的LINQ to XML版本

var xml = sorted.Select(s => new XElement("Student" 
           new XElement("StudentID", s.StudentID), 
           new XElement("FirstName", s.FirstName), 
           new XElement("LastName", s.LastName), 
           new XElement("Fees", 
            s.Fees.Select(f => new XElement("Fee", 
                  new XElement("FeeID", f.FeeID))).ToArray()))); 
+0

with strFeeData =“”;它使情况变得更糟:现在它显示只有1名学生所有费用 – user1618180 2013-03-13 08:11:09

+0

随着LINQ to XML版本,一旦我有了var xml,我只是textwriter(xml); ?或者如何处理它? – user1618180 2013-03-13 08:17:03

+0

只是'xml.ToString();' – MarcinJuraszek 2013-03-13 08:17:50

你为什么不尝试一下这样的,您可以随时使用XmlSerializer的改造C#对象的列表,以XML文档。

public string ToXML() 
    { 
     var stringwriter = new System.IO.StringWriter(); 
     var serializer = new XmlSerializer(this.GetType()); 
     serializer.Serialize(stringwriter, this); 
     return stringwriter.ToString(); 
    } 

这seializ你的类XML字符串

而且检查:Convert a C# object to XML?

Linq到XML的方式

XElement _customers = new XElement("Students", 
         from c in objCust 
         orderby c.CustID //descending 
         select new XElement("Student", 
          new XElement("name", c.StudentID), 
          new XElement("ID", c.FirstName), 
          new XElement("phone", c.LastName), 
          new XElement("Fees", (from x in x.Fees 
                orderby x.FeeID//descending 
          select new XElement("FeeID",x.FeesId)) 
         )) 

       ); 
+0

我仍然是C#初学者。解释更多?谢谢 – user1618180 2013-03-13 08:08:20

+0

@ user1618180 - 检查在谷歌C#序列化,并检查链接给你你会得到主意 – 2013-03-13 08:09:04