【问题标题】:How can i select specific childnodes with LINQ?如何使用 LINQ 选择特定的子节点?
【发布时间】:2011-04-21 17:37:57
【问题描述】:

我有一个节点,这个节点包含 5 个子节点。其中三个是RatePlan。如何使用 LINQ 选择那些 RatePlan 子节点?

让我们澄清一些事情:

我的xml是这样的:

<hotels>
<hotel id="1" name="hotel 1">
    <telephone>123456789</telephone>
    <fax>123</fax>
    <address>hotels address</address>
    <hotelRatePlan>10</hotelRatePlan>
    <hotelRatePlan>11</hotelRatePlan>
    <hotelRatePlan>12</hotelRatePlan>
  </hotel>
  <hotel id="2" name="hotel 2">
    <telephone>123456789</telephone>
    <fax>123</fax>
    <address>hotels address</address>
    <hotelRatePlan>100</hotelRatePlan>
    <hotelRatePlan>110</hotelRatePlan>
    <hotelRatePlan>120</hotelRatePlan>
  </hotel>
  <hotel id="3" name="hotel 3">
    <telephone>123456789</telephone>
    <fax>123</fax>
    <address>hotels address</address>
    <hotelRatePlan>10</hotelRatePlan>
    <hotelRatePlan>11</hotelRatePlan>
    <hotelRatePlan>12</hotelRatePlan>
  </hotel>
</hotels>

我正在使用 XMLDocument 来读取 XML 文件。读完之后,我使用 SelectNodes 进行选择。当我获得第一个酒店信息时,我想选择特定的子节点(hotelRatePlan)。我该怎么做?

【问题讨论】:

  • 请用代码解释

标签: linq xmlnode


【解决方案1】:

如果您确定每个酒店只有三个房价计划,那么您可以将酒店加载到酒店类型的对象中,如下所示:

XDocument data = XDocument.Load(yourXMLFileNameHere);
//if you have a namespace defined:
XNamespace ns = data.Root.Name.Namespace;

List<Hotels> hotels = (from item in data.Descendants(ns + "hotel")
                       select new Hotel
                       {
                         Id=Convert.ToInt32(item.Attribute("id").Value),
                         Name=item.Attribute("name").Value,
                         Telephone=item.Element(ns+"telephone").Value,
                         Fax=item.Element(ns+"fax").Value, 
                         Address=item.Element(ns+"address").Value,
                         RatePlan1=item.Element(ns+"hotelRatePlan1").Value,
                         RatePlan2=item.Element(ns+"hotelRatePlan2").Value,
                         RatePlan3=item.Element(ns+"hotelRatePlan3").Value
                        }).ToList<Hotels>();

然后您以下列方式引用您的第一个费率计划:

string ratePlan1=hotels[0].RatePlan1;

如果您的费率计划数量会有所不同,您可以将它们合并成一个字符串,如下所示:

<hotelRatePlans>10 20 30</hotelRatePlans>

然后您更改提取费率计划的方式,当您需要实际计划时,您使用 String.Split 方法获取单个计划的数组。

【讨论】:

    【解决方案2】:

    我想你的意思是:

    var ratePlans = node.ChildNodes.OfType&lt;RatePlan&gt;();

    【讨论】:

      【解决方案3】:

      您的问题不是特别清楚,但您可能只想:

      var ratePlans = node.Elements("RatePlan");
      

      假设您实际上使用的是 LINQ to XML,而不是 XmlNodeXmlDocument 等。如果您正在使用“旧”DOM API,那么您可以使用:

      var ratePlans = node.ChildNodes
                          .OfType<XmlElement>()
                          .Where(e => e.LocalName == "RatePlan");
      

      ...但如果可以的话,我会转向 LINQ to XML。它只是一个非常更好的 XML API。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-21
        • 1970-01-01
        • 2012-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多