在 C# 中使用 LINQ to XML 生成 XML 报告

Generating XML reports using LINQ to XML in C#

我在 C# 中使用 LINQ to XML 生成报告。 例如,我想生成格式如下的报告:

<report>
    <canada>
        <division_1>
            <power generated="22" dailygoal="25" />
            <resources used="15" available="50" />
        </division_1>
        <division_2>
            <power generated="36" dailygoal="40" />
            <resources used="28" available="85" />
        </division_2>
    </canada>
</report>

如何使用 foreach 循环和对象方法在 C# 中生成具有这种格式的 XML 文件(具有一个根元素)来填充数据,因为我是从电源获取数据的和资源对象?:

foreach (var i in powerList)
{
    division_1.Add(
        new XElement("power",
            new XAttribute("generated", i.powerGenerated),
            new XAttribute("dailygoal", i.powerGoal)),
        new XElement("resources",
            new XAttribute("used", i.resourcesUsed),
            new XAttribute("available", i.resourcesAvailable)));
{

我可以使用 XDocument 对象执行此操作,还是需要将 division_1 和 division_2 初始化为 XElements,执行 .Add 以将信息添加到 XElements,.将 XElements 另存为.xml 个文档,然后合并并保存为一个文档?

更新:

我已将代码修改为如下所示...:[=​​16=]

namespace ConsoleApplication3
{
class Program
{
    static void Main(string[] args)
    {

        // list of power objects...

        List<Power> powerList = new List<Power>();

        Power canada = new Power("canada", 25, 50, 70, 100);
        Power usa = new Power("usa", 45, 60, 80, 150);
        Power sweden = new Power("sweden", 50, 60, 70, 80);
        Power germany = new Power("germany", 65, 75, 90, 125);

        powerList.Add(canada);
        powerList.Add(usa);
        powerList.Add(sweden);
        powerList.Add(germany);

        // create report var and element..

        var report = new XElement("report");

        // foreach...
        foreach (var x in powerList)
        {

            var country = new XElement(x.Country);
            report.Add(country);

            var n = 0;

            //foreach...
            foreach (var i in powerList)
            {
                ++n;

                var division = new XElement("division_" + n);

                division.Add(
                    new XElement("power",
                        new XAttribute("generated", i.powerGenerated),
                        new XAttribute("dailygoal", i.powerGoal)),
                    new XElement("resources",
                        new XAttribute("used", i.resourcesUsed),
                        new XAttribute("available", i.resourcesAvailable)));
                country.Add(division);
            }
        }

        // create xdocument from xelement and save to disk...

        XDocument xml = new XDocument();
        xml.Add(report);

        xml.Save(@".\report.xml");
    }
}
}

...但它正在生成,例如:

<canada>
    <division_1>
        <power generated="25" dailygoal="50" />
        <resources used="70" available="100" />
    </division_1>
    <division_2>
        <power generated="45" dailygoal="60" />
        <resources used="80" available="150" />
    </division_2>
    <division_3>
        <power generated="50" dailygoal="60" />
        <resources used="70" available="80" />
    </division_3>
    <division_4>
        <power generated="65" dailygoal="75" />
        <resources used="90" available="125" />
    </division_4>
</canada>
<usa>
    <division_1>
        <power generated="25" dailygoal="50" />
        <resources used="70" available="100" />
    </division_1>
    <division_2>
        <power generated="45" dailygoal="60" />
        <resources used="80" available="150" />
    </division_2>
    <division_3>
        <power generated="50" dailygoal="60" />
        <resources used="70" available="80" />
    </division_3>
    <division_4>
        <power generated="65" dailygoal="75" />
        <resources used="90" available="125" />
    </division_4>
</usa>

在循环中,它为每个 运行 通过的所有对象生成相同的数据。您知道问题是什么以及如何解决吗?我尝试了多种方法,但似乎无法理解。

是的,你可以使用 XElement:

  var root = new XElement("report");
  var canada=new XElement("canada");
  root.Add(canada);
  for(int i=0;i<powerList.Count();i++)
  { 
        canada.Add(new XElement("division"+(i+1).ToString(),
        new XElement("power",
            new XAttribute("generated", powerList[i].powerGenerated),
            new XAttribute("dailygoal", powerList[i].powerGoal)),
        new XElement("resources",
            new XAttribute("used", powerList[i].resourcesUsed),
            new XAttribute("available", powerList[i].resourcesAvailable))));
  }
  root.Save("Root.xml");

XElement 有一个 Save 方法。

这似乎符合您的要求:

var powerList = new PowerList[] {
    new PowerList { powerGenerated = 22, powerGoal = 25, resourcesUsed = 15, resourcesAvailable = 50 },
    new PowerList { powerGenerated = 36, powerGoal = 40, resourcesUsed = 28, resourcesAvailable = 85 }
};

var report = new XElement("report");
var country = new XElement("canada");
report.Add(country);

var n = 0;
foreach (var i in powerList)
{
    ++n;
    var division = new XElement("division_"+n);

    division.Add(
        new XElement("power",
            new XAttribute("generated", i.powerGenerated),
            new XAttribute("dailygoal", i.powerGoal)),
        new XElement("resources",
            new XAttribute("used", i.resourcesUsed),
            new XAttribute("available", i.resourcesAvailable)));
    country.Add(division);
}

XDocument xml = new XDocument();
xml.Add(report);