Как выбрать конкретные дочерние узлы с помощью LINQ? - PullRequest
2 голосов
/ 06 октября 2010

У меня есть узел, и этот узел содержит 5 дочерних узлов.три из них это RatePlan.Как я могу выбрать эти дочерние узлы RatePlan с помощью LINQ?

Давайте уточним что-то:

мой 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 ]

9 голосов
/ 06 октября 2010

Ваш вопрос не особенно понятен, но вы могли бы просто захотеть:

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

Это предполагает, что вы на самом деле используете LINQ to XML, а неXmlNode, XmlDocument и т. Д. Если вы используете "старый" DOM ​​API, вы можете использовать:

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

... но я бы перешел на LINQ, чтобыXML, если вы можете.Это просто намного более приятный XML API.

0 голосов
/ 10 мая 2011

Если вы уверены, что у вас будет только три тарифных плана на отель, вы можете загрузить отель в объект типа Отель, например, так:

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, чтобы получить массив отдельных планов.

0 голосов
/ 06 октября 2010

Я думаю, что вы имеете в виду:

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

...