简体   繁体   English

使用Double Foreach循环输出数据时的相同结果

[英]Same Result when Outputting Data Using Double Foreach Loop

I need to set a string into something like this 我需要将字符串设置为这样的东西

<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

My code 我的代码

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";
}

I got this part outputted correctly 我把这部分输出正确了

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

But for Fees 但对于费用

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

I got the same Fees for every students. 我为每个学生都收取了同样的费用。

What is wrong with my double foreach loop? 我的双foreach循环有什么问题?

(I already checked sorted's Fee has different values, the problem must be at the double foreach loop) (我已经检查过sort's Fee有不同的值,问题必须是双foreach循环)

Thanks 谢谢

Initialize strFeeData with empty string within outer loop: 在外部循环中使用空字符串初始化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";
}

However, it's really bad idea to create XML using string concatenation! 但是, 使用字符串连接创建XML真是个坏主意! You should read about Serialization or LINQ to XML! 您应该阅读有关序列化或LINQ to XML的信息!

LINQ to XML version 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())));

why dont you try out like this ,You can always use XmlSerializer to transform a list of C# objects to XML document. 为什么不尝试这样,你总是可以使用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();
    }

this seializ your class to xml string 这个seializ你的类为xml字符串

Also check this : Convert a C# object to XML? 还要检查: 将C#对象转换为XML?

Linq To XML way Linq To 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)) 
                        ))

                  );

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM