В настоящее время я работаю над приложением Silverlight, и мне нужно преобразовать данные XML в соответствующие объекты для привязки данных. Базовое определение класса для этого обсуждения:
public class TabularEntry
{
public string Tag { get; set; }
public string Description { get; set; }
public string Code { get; set; }
public string UseNote { get; set; }
public List<string> Excludes { get; set; }
public List<string> Includes { get; set; }
public List<string> Synonyms { get; set; }
public string Flags { get; set; }
public List<TabularEntry> SubEntries { get; set; }
}
Ниже приведен пример XML, который может прийти для подачи этого объекта:
<I4 Ref="1">222.2
<DX>Prostate</DX>
<EX>
<I>adenomatous hyperplasia of prostate (600.20-600.21)</I>
<I>prostatic:
<I>adenoma (600.20-600.21)</I>
<I>enlargement (600.00-600.01)</I>
<I>hypertrophy (600.00-600.01)</I>
</I>
</EX>
<FL>M</FL>
</I4>
Итак, различные узлы сопоставляются с конкретными свойствами. Ключевыми для этого вопроса являются узлы <EX>
и <I>
. Узлы <EX>
будут содержать коллекцию из одного или нескольких узлов <I>
и в этом примере соответствуют свойству «Исключает» в приведенном выше определении класса.
Вот идет вызов (для меня). У меня нет контроля над веб-службой, которая генерирует этот XML, поэтому изменить его нельзя. Вы заметите, что в этом примере один узел <I>
также содержит другую коллекцию из одного или нескольких узлов <I>
. Я надеюсь, что смогу использовать запрос LINQ to XML, который позволит мне объединить оба уровня в одну коллекцию и использовать символ, который будет разделять элементы нижнего уровня, поэтому в этом примере, когда запрос LINQ вернул TablularEntry объект, он будет содержать коллекцию исключаемых элементов, которая будет выглядеть следующим образом:
- аденоматозная гиперплазия предстательной железы
(600.20-600.21)
- простатической:
- * аденома (600.20-600.21)
- * увеличение (600,00-600,01)
- * гипертрофия (600.00-600.01)
Итак, в XML последние 3 записи на самом деле являются дочерними объектами второй записи, но в свойстве Exclude объекта они являются частью одной коллекции, причем прежние дочерние объекты содержат идентификатор / строку идентификатора.
У меня есть начало запроса LINQ, который я использую ниже, я не могу понять, что будет объединять дочерние объекты для меня. Код, как он существует сейчас:
List<TabularEntry> GetTabularEntries(XElement source)
{
List<TabularEntry> result;
result = (from tabularentry in source.Elements()
select new TabularEntry()
{
Tag = tabularentry.Name.ToString(),
Description = tabularentry.Element("DX").ToString(),
Code = tabularentry.FirstNode.ToString(),
UseNote = tabularentry.Element("UN") == null ? null : tabularentry.Element("UN").Value,
Excludes = (from i in tabularentry.Element("EX").Elements("I")
select i.Value).ToList()
}).ToList();
return result;
}
Я думаю, что мне нужно вложить оператор FROM в
Исключает = (из i ...)
оператор, чтобы собрать дочерние узлы, но не может его обработать. Конечно, это может быть из-за того, что я немного оторвался от сорняков по своей логике.
Если вам нужна дополнительная информация, чтобы ответить, не стесняйтесь спрашивать.
Заранее спасибо,
Steve