【问题标题】:Select Multiple Elements in XML在 XML 中选择多个元素
【发布时间】:2017-01-31 13:11:27
【问题描述】:

我有以下 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;

为了获得多个时间表 ID,我需要更改什么?

更新:我如何做同样的事情,但有两条路线?刚刚重新查看了原始的 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>

【问题讨论】:

标签: c# xml windows linq


【解决方案1】:

您需要一个复合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;

【讨论】:

  • 谢谢凯文,我现在如何以通常的方式选择列表框中的项目? 'var Service = (时间表)routeNames.SelectedItem;
【解决方案2】:

在内部for循环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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    • 2016-08-16
    • 2023-03-11
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多