Мне нужна помощь в разборе XML с Linq - PullRequest
1 голос
/ 20 августа 2011

Я новичок в C # и XML и пытаюсь разработать небольшой плагин погоды для MediaPortal.Я пытаюсь проанализировать XML с помощью Linq в Visual C # 2010 Express и наткнулся на препятствие.

Вот подмножество XML, которое я пытаюсь проанализировать:

<forecast>
  <period textForecastName="Monday">Monday</period>
  <textSummary>Sunny. Low 15. High 26.</textSummary>
<temperatures>
  <textSummary>Low 15. High 26.</textSummary>
  <temperature unitType="metric" units="C" class="high">26</temperature>
  <temperature unitType="metric" units="C" class="low">15</temperature>
  </temperatures>
</forecast>

мой рабочий код до сих пор:

XDocument loaded = XDocument.Parse(strInputXML);
var forecast = from x in loaded.Descendants("forecast")
select new
{
    textSummary = x.Descendants("textSummary").First().Value,
    Period = x.Descendants("period").First().Value,
    Temperatures = x.Descendants("temperatures"),
    Temperature = x.Descendants("temperature"),
    //code to extract high e.g. High = x.Descendants(...class="high"???),
    //code to extract low  e.g. High = x.Descendants(...class="low"???)
};

Мой код работает до моих комментариев заполнителя, но я не могу понять, как извлечь из XML верхнего (26) и нижнего (15), используяLinq.Я мог бы вручную разобрать его из «Температуры», но я надеюсь, что смогу узнать немного больше о структурах XML.

Спасибо за любую помощь.Дуг

1 Ответ

0 голосов
/ 20 августа 2011

Похоже, что вы хотите что-то как :

High = (int)x.Descendants("temperature")
            .Single(e => (string)e.Attribute("class") == "high")

Это находит только temperature потомка (если нет или несколько, это будетthrow) с атрибутом class со значением high, а затем преобразует его значение в целое число.

Но это не совсем ясно.

Может ли элемент forecast иметь несколько temperatures элементов?Может ли элемент temperatures иметь несколько элементов temperature, которые имеют class == "high"?Как вы хотите иметь дело с различными unitTypes?

Чтобы просто получить элементы, вы можете сделать что-то вроде:

Highs = x.Descendants("temperature")
         .Where(e => (string)e.Attribute("class") == "high")
...