2017-01-31 26 views
0

で複数の要素を選択したファイル(バージョンダウンカット):私は、次のXMLを持つXML

<Service z:Id="i1" xmlns="http://schemas.datacontract.org/2004/07/BusExpress.ClassLibrary" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"> 
<routes> 
<Route z:Id="i4"> 
    <timetables> 

     <Timetable z:Id="i8"> 
     <timetableId>11061</timetableId> 
     </Timetable> 

     <Timetable z:Id="i8">   
     <timetableId>11062</timetableId> 
     </Timetable> 

    </timetables> 
    </Route> 
</routes> 
</Service> 

を、私は最初のIDを取得することができる午前:11061を、私は本当では、第2の1を取得したいですファイルには他にもいくつかあります。しかし、私はそれを取得します私は2つを得ることができ、一度仮定より2

XDocument doc = XDocument.Load("timetableTest.xml"); 
     XNamespace ns = "http://schemas.datacontract.org/2004/07/BusExpress.ClassLibrary"; 

     var routeNames = (from n in doc.Descendants(ns + "Service").Descendants(ns + "routes").Descendants(ns + "Route")//.Descendants(ns + "timetables")//.Descendants(ns + "Service") 
          select new RootContainer 
          { 
           Services = (from s in n.Elements(ns + "timetables")//.Elements(ns + "clients") 
                       // where n.Elements(ns + "Service") != null 
              select new Services 

              { 
               ServiceName = s.Element(ns + "Timetable").Element(ns + "timetableId").Value, 
               //serviceIconUrl = "/Assets/Services/" + s.Element(ns + "serviceName").Value + ".png", 
              // ServiceId = s.Element(ns + "serviceId").Value 
              }).ToList() 
          }).Single(); 

     listServices.ItemsSource = routeNames.Services; 

私は、複数の時刻表のIdsを得るために変更する必要がありますか?

アップデート:同じ方法を2つのルートでどうやって行うのですか?ちょうど元のXMLフィードを見直しました。

<Service z:Id="i1" xmlns="http://schemas.datacontract.org/2004/07/BusExpress.ClassLibrary" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/"> 
<routes> 
<Route z:Id="i4"> 
    <timetables> 

     <Timetable z:Id="i8"> 
     <timetableId>11061</timetableId> 
     </Timetable> 

     <Timetable z:Id="i8">   
     <timetableId>11062</timetableId> 
     </Timetable> 

    </timetables> 
    </Route> 
<Route z:Id="i4"> 
    <timetables> 

     <Timetable z:Id="i8"> 
     <timetableId>11061</timetableId> 
     </Timetable> 

     <Timetable z:Id="i8">   
     <timetableId>11062</timetableId> 
     </Timetable> 

    </timetables> 
    </Route> 

</routes> 
</Service> 
+1

あなたの選択の最後に非常に不審な '.Single()'があることがわかります。 また、https://msdn.microsoft.com/en-us/library/system.xml.xmldocument.selectnodes(v=vs.110).aspx は、このネストされたLINQよりもかなり簡単です。 –

答えて

0

は、あなたは多くの時刻表を選択する化合物from clauseを必要とする:直接要素のループRootContainerクラス

Services = (from s in n.Elements(ns + "timetables").Descendants(ns +"Timetable") 

とアクセスのための内部における

XDocument doc = XDocument.Load("timetableTest.xml"); 
    XNamespace ns = "http://schemas.datacontract.org/2004/07/BusExpress.ClassLibrary"; 

    var routeNames = (from n in doc.Descendants(ns + "Service").Descendants(ns + "routes").Descendants(ns + "Route")//.Descendants(ns + "timetables")//.Descendants(ns + "Service") 
         select new 
         { 
          Services = (from s in n.Elements(ns + "timetables")//.Elements(ns + "clients") 
             from t in s.Descendants(ns + "Timetable")        // where n.Elements(ns + "Service") != null 
             select new 

             { 
              ServiceName = t.Element(ns + "timetableId").Value, 
              //serviceIconUrl = "/Assets/Services/" + s.Element(ns + "serviceName").Value + ".png", 
             // ServiceId = s.Element(ns + "serviceId").Value 
             }).ToList() 
         }).Single(); 

    listServices.ItemsSource = routeNames.Services; 
+0

ありがとうKevin、リストボックスの項目を通常の方法で選択するにはどうしたらいいですか? 'var Service =(時刻表)routeNames.SelectedItem; –

0

使用子孫を

ServiceName = s.Element(ns + "timetableId").Value, 

フルコード

var routeNames = (from n in doc.Descendants(ns + "Service").Descendants(ns + "routes").Descendants(ns + "Route")//.Descendants(ns + "timetables")//.Descendants(ns + "Service") 
          select new RootContainer 
          { 
           Services = (from s in n.Elements(ns + "timetables").Descendants(ns +"Timetable") 
                       // where n.Elements(ns + "Service") != null 
              select new Services 

              { 
               ServiceName = s.Element(ns + "timetableId").Value, 
               //serviceIconUrl = "/Assets/Services/" + s.Element(ns + "serviceName").Value + ".png", 
              // ServiceId = s.Element(ns + "serviceId").Value 
              }).ToList() 
          }).Single(); 
関連する問題