2009-06-10 4 views
0

Я пишу программу для анализа некоторых сторонних XML-файлов. Структура что-то вроде ...Эффективно «свертывание» в XML-дерево с помощью xlinq?

<CharacterSheet> 
    ... 
    <StatBlock> 
     ... 
     <Stat> 
      ... 
      <alias /> 
      ... 
     </Stat> 
     ... 
    </StatBlock> 
    ... 
</CharacterSheet> 

Я использую это, чтобы получить некоторую практику с помощью LINQ, и я осветления я должен написать некоторые действительно уродливые прикованных запросы, чтобы получить то, что я хочу, список статистики и всех их псевдонимов.

var CharSheet = from i in character.Elements() 
     where i.Name == "CharacterSheet" 
     select i; 

var StatBlocks = from sheet in CharSheet 
     from statBlock in sheet.Elements() 
     where statBlock.Name == "StatBlock" 
     select statBlock; 

var stats = from statBlock in StatBlocks 
     from stat in statBlock.Elements() 
     select stat; 

var statAliases = from stat in stats 
      from alias in stat.Elements() 
      where alias.Name == "alias" 
      select new { stat, alias }; 

И я понимаю, что я мог бы сделать это в один очень долгий запрос с использованием «в» (который первоначально, как у меня было), но это только сделал его еще более плотным и трудно работать.

Кажется, что должен быть более простой способ сделать то, что я пытаюсь сделать.

ответ

6

Вы можете использовать XPathSelectElements() (что может быть лучшей идеей, если честно), или вы можете использовать метод Elements() расширения:

var query = character.Elements("CharacterSheet") 
        .Elements("StatsBlock") 
        .Elements() 
        .Elements("alias") 
        .Select(x => new { stat=x.Parent, alias=x}; 
+0

Спасибо! На самом деле это была моя естественная склонность (попытка .Elements («name»), но в визуальной студии говорилось, что единственным аргументом, который я мог бы передать, было XName, поэтому я даже не пытался использовать строку, и я не мог выяснить, как сделать XName. Но да, это прекрасно работает (или, по крайней мере, компилятор не против, чтобы я помещал там строки ... Я еще не проверял его, но я подозреваю, что все должно быть хорошо) – Asmor

+0

Yup, вы используете неявное преобразование из строки в XName, которое используется почти повсеместно :) –

+0

XName вещь немного боль, поскольку «intellisense» недостаточно интеллектуальна, чтобы указать что строки неявно преобразуются. – Peter

Смежные вопросы