如何使用LINQ选择特定的子节点?

时间:2010-10-06 09:37:23

标签: linq xmlnode

我有一个节点,此节点包含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)。我怎么能这样做?

3 个答案:

答案 0 :(得分:9)

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

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

假设你实际使用LINQ to XML而不是XmlNodeXmlDocument等。如果 使用“old” DOM API,您可以使用:

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

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

答案 1 :(得分:0)

我认为你的意思是:

var ratePlans = node.ChildNodes.OfType<RatePlan>();

答案 2 :(得分:0)

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

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方法获取各个计划的数组。