2008-09-05 1 views
0

У меня есть граф объектов, сериализованный в xaml. Грубый пример того, что он выглядит как это:Как я могу извлечь часть графа объекта xaml через linq в xml?

<MyObject xmlns.... > 
    <MyObject.TheCollection> 
     <PolymorphicObjectOne .../> 
     <HiImPolymorphic ... /> 
    </MyObject.TheCollection> 
</MyObject> 

Я хочу использовать Linq для XML, чтобы извлечь сериализованные объекты в TheCollection.

Примечание: MyObject может быть названо по-разному во время выполнения; Меня интересует любой объект, который реализует один и тот же интерфейс, который имеет публичную коллекцию с именем TheCollection, которая содержит типы IPolymorphicLol.

Единственная вещь, которую я знаю во время выполнения, - это глубина, на которой я нахожу коллекцию, и что элемент коллекции называется `` * .TheCollection`. Все остальное изменится.

xml будет получен из базы данных с использованием Linq; если бы я мог объединить оба запроса, чтобы вместо получения всего сериализованного графика, а затем извлечения объектов коллекции, я просто вернул бы коллекцию, которая была бы сладкой.

ответ

0

Will,

Это не представляется возможным выяснить, реализует ли объект некоторый интерфейс, посмотрев на XAML.
С предоставленными ограничениями вы можете найти элемент xml с именем ребенка.

Вы можете использовать следующий код: Это возвращает все элементы, имеющие дочерний элемент, имя которого оканчивается .TheCollection

static IEnumerable<XElement> FindElement(XElement root) 
    { 
     foreach (var element in root.Elements()) 
     { 
      if (element.Name.LocalName.EndsWith(".TheCollection")) 
      { 
       yield return element.Parent; 
      } 
      foreach (var subElement in FindElement(element)) 
      { 
       yield return subElement; 
      } 
     } 
    } 

Чтобы убедиться, что объект, представленный этим элементом реализует некоторый интерфейс, который нужно прочитать метаданные из ваших сборок. Я бы рекомендовал вам использовать среду Mono.Cecil для анализа типов в ваших сборках без использования рефлексии.

0

@aku
Да, я знаю, что xaml не содержит признаков базовых типов или интерфейсов. Но я знаю интерфейс корневых объектов и интерфейс, который хранится в коллекции, во время компиляции.

Сериализованные графики хранятся в базе данных sql как XML, и мы используем linq для извлечения их как XElements. В настоящее время, наряду с вашим решением, мы ограничены десериализацией графиков, итерацией через них, вытаскиванием объектов, которые мы хотим из коллекции, удаления всех ссылок на них, а затем избавления их родителей. Все это очень глупо. Я надеялся на одноразовое решение; что-то по строкам xpath, но встроено в наш запрос linq to sql, который возвращает только те элементы, которые мы ищем ...

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