2017-01-31 4 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.

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; 

Что мне нужно изменить, чтобы получить множественный Расписание Идентификаторы?

Обновление: Как мне сделать то же самое, но с двумя путями? Просто просмотрите исходный 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 смотрится намного easiert, чем это вложенная LINQ –

ответ

0

Вам необходимо соединение from clause выбрать множество графиков:

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

Спасибо вам Кевин, Как теперь выбрать элемент в списке в обычном режиме? 'var Service = (расписания) routeNames.SelectedItem; –

0

Используйте потомков в внутренние петли RootContainer класса

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

и доступ непосредственно в элементе

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(); 
Смежные вопросы