2016-09-21 12 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両方。ここ

ので、私はすべての従業員のために「Monat3」のすべての月を取得する必要があり、「Monat9」内のすべての予測ヶ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> 

の一部です。

あなたはしかし doc.Root.Elements()

にこのライン doc.Root.Elements().Descendants(nsXml + "MitarbeiterGroup") を変え、できるだけ早く

+0

のようになります。もう一つ注意すべきは、Monat3のためにあなたが属性Textbox143を使用していて、Monat9のためにあなたもTextbox143を使用していることです。Monat3属性は実際にTextbox142です。 –

+0

正解私は間違ってコピーしますが、それでも動作しません。 –

+0

xDescendants( "Monat3")に名前空間を追加します。 – jdweng

答えて

1

として、私はあなたのnsXml変数がどのように見えるかわからないんだけど、助けることができる場合くださいは、私のために働きました。 enter image description here

おそらくnsが間違っていますか?

編集:私はこれが(ちなみに要素とは何かを持って信じ

使用doc.Descendants("MitarbeiterGroup")代わりのdoc.Root.Elements().Descendants()

これは私が

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

EDITを使用するXMLであります)が動作します。あなたは、次の2つを比較した場合:

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

あなたはDescendants()Elements()は、階層のような木で、あなたがDescendants()を呼び出しているにもかかわらず、あなたはすでにElements()

呼ばれてきたように、すべての子どものフラットなリストであることがわかります

EDIT:

あなたは再びTERMIでわからない(それは完全修飾する必要があります代わりにx.Descendants("Monat3")またはx.Descendants(XName.Get("Monat3"))のようにそれを呼び出して使用するのでは、x.Descendants()を呼び出すラムダインサイド? 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を追加しました –

関連する問題