3

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

4

3 回答 3

12

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

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。

于 2010-10-06T09:39:52.927 回答
1

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

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>();

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

字符串 ratePlan1=hotels[0].RatePlan1;

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

<hotelRatePlans>10 20 30</hotelRatePlans>

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

于 2011-05-10T12:38:07.553 回答
0

我想你的意思是:

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

于 2010-10-06T09:41:47.400 回答