我正在编写一个从XML读取并将信息放在列表中的代码。 信息:
它们都存在于XML文件中。
我写了这段代码:
List<MonthlyInformation> result =
doc.Root.Elements().Descendants(nsXml + "MitarbeiterGroup")
.Select(x => new MonthlyInformation
{
Firstname = (string)x.Attribute("Group9"),
FinishedMonths = x.Descendants("Monat3").Select(s => new FinishedMonth {MonthName = (string)s.Attribute("Monat3"), Money = (string)s.Element("Cell").Attribute("Textbox142") }).ToList(),
ForecastMonths = x.Descendants("Monat9").Select(s => new ForecastMonth { MonthName = (string)s.Attribute("Monat9"), Money = (string)s.Element("Cell").Attribute("Textbox143") }).ToList()
}).ToList();
代码工作正常,但FinishedMonths和ForecastMonths datamember都是空的。
这是XML的一部分
<MitarbeiterGroup Group9="Name....">
<Textbox111>
<UmsatzInternGroup_Collection>
<UmsatzInternGroup>
<Monat3 Monat3="Jan.">
<Cell Textbox142="11325" />
</Monat3>
</UmsatzInternGroup>
<UmsatzInternGroup>
<Monat3 Monat3="Feb.">
<Cell Textbox142="12345" />
</Monat3>
</UmsatzInternGroup>
</UmsatzInternGroup_Collection>
<ForecastExternGroup_Collection>
<ForecastExternGroup>
<Monat9 Monat9="Sep.">
<Cell Textbox143="17130" />
</Monat9>
</ForecastExternGroup>
<ForecastExternGroup>
<Monat9 Monat9="Okt.">
<Cell Textbox143="18000" />
</Monat9>
</ForecastExternGroup>
</ForecastExternGroup_Collection>
</Textbox111>
</MitarbeiterGroup>
所以我需要在&#34; Monat3&#34;以及&#34; Monat9&#34;。
中的所有预测月份请尽快提供帮助
答案 0 :(得分:1)
我不确定你的nsXml
变量是什么样的,但是改变了这一行
doc.Root.Elements().Descendants(nsXml + "MitarbeiterGroup")
至
doc.Root.Elements()
也许你的ns不正确?
编辑:
这是我使用的XML
<MitarbeiterGroup Group9="Name....">
<Textbox111>
<UmsatzInternGroup_Collection>
<UmsatzInternGroup>
<Monat3 Monat3="Jan.">
<Cell Textbox142="11325" />
</Monat3>
</UmsatzInternGroup>
<UmsatzInternGroup>
<Monat3 Monat3="Feb.">
<Cell Textbox142="12345" />
</Monat3>
<ForecastExternGroup_Collection>
<ForecastExternGroup>
<Monat9 Monat9="Sep.">
<Cell Textbox143="17130" />
</Monat9>
</ForecastExternGroup>
<ForecastExternGroup>
<Monat9 Monat9="Okt.">
<Cell Textbox143="18000" />
</Monat9>
</ForecastExternGroup>
</ForecastExternGroup_Collection>
</UmsatzInternGroup>
</UmsatzInternGroup_Collection>
</Textbox111>
</MitarbeiterGroup>
编辑:
使用doc.Descendants("MitarbeiterGroup")
代替doc.Root.Elements().Descendants()
我相信这与Elements()的工作方式有关。如果你比较以下两个:
var descendants = doc.Descendants().ToList();
var elements = doc.Elements().ToList();
您可以看到Descendants()
是所有孩子的平面列表,其中Elements()
是树状层次结构,即使您正在调用Descendants()
,您已经调用了Elements()
1}}
编辑:
在lambda内再次调用x.Descendants()
,而不是像x.Descendants("Monat3")
或x.Descendants(XName.Get("Monat3"))
那样调用它,它需要完全限定(?不确定术语) ,它应该看起来像x.Descendants(XName.Get("Monat3", ns))
string testURL = "XML.xml";
XDocument doc = XDocument.Load(testURL);
string ns = doc.Root.GetDefaultNamespace().ToString();
List<MonthlyInformation> result =
doc.Descendants(XName.Get("MitarbeiterGroup", ns))
.Select(x =>
new MonthlyInformation
{
Name = (string)x.Attribute("Group9"),
FinishedMonths = x.Descendants(XName.Get("Monat3", ns)).Select(s => new FinishedMonth
{
MonthName = (string)s.Attribute("Monat3"),
Money = "money" //(string)s.Element("Cell").Attribute("Textbox142")
}).ToList(),
ForecastMonths = x.Descendants(XName.Get("Monat9", ns)).Select(s => new ForecastMonth
{
MonthName = (string)s.Attribute("Monat9"),
Money = "money" //(string)s.Element("Cell").Attribute("Textbox143")
}).ToList()
}).ToList();