LINQ to XML: выражение запроса для дерева, где некоторые значения являются атрибутами, а другие - значениями узлов - PullRequest
1 голос
/ 15 апреля 2010

Я пытаюсь написать выражение запроса для разбора дерева XML, но без особой удачи.

Дерево выглядит следующим образом:

<item> 
    <itemInfo id="1965339" lang="en" key="title"> 
      <info>Octopuzzle&#xd;</info> 
    </itemInfo> 
    <itemInfo id="1965337" lang="en" key="longDescription"> 
      <info>&quot;In Octopuzzle you play the Octopus on a mission! Escape the dangerous reef, and save it in the process. To do so you’ll have to make it through 20 challenging levels.&#xd;
The game offers a real brain teasing levels packed with interactive sea creatures and objects that will keep you hooked for more. Along the way you’ll have shooting challenges, cannons to jump from, meet armoured fish, and many more surprises the deep-sea has to offer.&#xd;
Are you ready for the deep-sea puzzle adventure?&#xd;
&quot;&#xd;</info> 
    </itemInfo> 
    <itemInfo id="1965335" lang="en" key="shortDescription"> 
      <info>In Octopuzzle you play the Octopus on a mission! Escape the dangerous reef, and save it in the process. To do so you’ll have to make it through 20 challenging levels.&#xd;</info> 
    </itemInfo> 
</item>

Я загружаю в XElement без проблем.

Мне нужно получить значения title , краткое описание и длинное описание соответственно для данного значения атрибута lang, в этот случай ru .

Кто-нибудь может помочь? Спасибо

1 Ответ

0 голосов
/ 15 апреля 2010

Конечно, что-то вроде:

private string GetValue(XElement element, string language, string key)
{
    return element.Elements("itemInfo")
                  .Where(x => (string) x.Attribute("lang") == language)
                  .Where(x => (string) x.Attribute("key") == key)
                  .Select(x => (string) x.Element("info"))
                  .FirstOrDefault();
}
...
string title = GetValue(item, "en", "title");
string longDescription = GetValue(item, "en", "longDescription");
string shortDescription = GetValue(item, "en", "shortDescription");

Если у вас уже есть соответствующий элемент item, я не думаю, что вам действительно нужно выражение запроса; если вы запрашиваете несколько элементов, вы можете. Например:

var query = from item in doc.Descendants("item")
            select new {
                Title = GetValue(item, "en", "title"),
                LongDescription = GetValue(item, "en", "longDescription"),
                ShortDescription = GetValue(item, "en", "shortDescription");
            };

Или в форме выражения без запроса:

var query = doc.Descendants("item")
               .Select(item => new {
                    Title = GetValue(item, "en", "title"),
                    LongDescription = GetValue(item, "en", "longDescription"),
                    ShortDescription = GetValue(item, "en", "shortDescription");
               };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...