在 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);
我在 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);