从XML获取子查询列表c#

时间:2016-09-21 09:39:14

标签: c# xml lambda subquery

我正在编写一个从XML读取并将信息放在列表中的代码。 信息:

  1. 员工姓名
  2. 他已经完成的月份
  3. 他需要工作的月份。
  4. 它们都存在于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;。

    中的所有预测月份

    请尽快提供帮助

1 个答案:

答案 0 :(得分:1)

我不确定你的nsXml变量是什么样的,但是改变了这一行 doc.Root.Elements().Descendants(nsXml + "MitarbeiterGroup")doc.Root.Elements()

为我工作。 enter image description here

也许你的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();