2016-09-21 97 views
0

我正在編寫一個從XML讀取並將信息放在列表中的代碼。 信息:從XML獲取子查詢列表c#

  1. 員工姓名
  2. 的幾個月裏,他已經完成
  3. 他需要工作在幾個月。

它們都存在於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數據成員總是空的。

這裏是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> 

,所以我需要在「Monat3」和所有的預測月「Monat9」讓每一個員工的所有個月的一部分。

請,如果你能儘快

+0

有一點要注意,Monat3您所使用的屬性Textbox143和Monat9您也使用Textbox143。Monat3屬性實際上是Textbox142。 –

+0

正確我錯誤地複製它,但仍然不起作用。 –

+0

將名稱空間添加到x.Descendants(「Monat3」)。 – jdweng

回答

1

我不知道你的nsXml變量是什麼樣的幫助,但是改變這一行 doc.Root.Elements().Descendants(nsXml + "MitarbeiterGroup")doc.Root.Elements()

爲我工作。 enter image description here

也許你有ns不正確?

編輯:

這是我用

<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> 

編輯XML:

使用doc.Descendants("MitarbeiterGroup")代替doc.Root.Elements().Descendants()

我beleive這個事做與方式的元素( )的作品。如果你比較有以下兩種:

var descendants = doc.Descendants().ToList(); 
var elements = doc.Elements().ToList(); 

你可以看到,Descendants()是所有孩子的扁平列表,其中爲Elements()像層次樹,即使你調用Descendants()你已經叫Elements()

編輯:

拉姆達裏面,你再打電話x.Descendants(),而不是使用調用它像x.Descendants("Monat3")或者它必須是完全合格的(不知道在TERMI x.Descendants(XName.Get("Monat3"))? nology),它應該看起來像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(); 
+0

它給了我一個空字符串 –

+0

和名稱空間是正確的,因爲我正在從xml本身讀取它,旁邊給了我一個名單的列表。 XElement report =(XElement)doc.FirstNode; XNamespace nsXml = report.GetDefaultNamespace(); –

+0

我已添加用於測試的XML –