2008-09-05 13 views
0

Ich habe ein Objekt-Diagramm nach xaml serialisiert. Eine grobe Probe von dem, was es sieht aus wie ist:Wie kann ich einen Teil eines Xaml Objekt Graphen über Linq nach XML extrahieren?

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

ich Linq to XML verwenden, um möchten die serialisierten Objekte innerhalb des TheCollection zu extrahieren.

Hinweis: MyObject kann zur Laufzeit anders benannt sein; Ich bin an jedem Objekt interessiert, das dieselbe Schnittstelle implementiert, die über eine öffentliche Sammlung namens TheCollection verfügt, die Typen IPolymorphicLol enthält.

Die einzigen Dinge, die ich zur Laufzeit kenne, sind die Tiefe, in der ich die Sammlung finden werde und das Sammlungselement heißt `` * .TheCollection`. Alles andere wird sich ändern.

Das XML wird aus einer Datenbank mit Linq abgerufen; Wenn ich beide Abfragen kombinieren könnte, würde ich anstatt die gesamte serialisierte Grafik zu erhalten und dann die Sammlungsobjekte zu extrahieren, nur die Sammlung zurückbekommen, die süß wäre.

Antwort

0

Will,

Es ist nicht möglich, um herauszufinden, ob ein Objekt eine Schnittstelle implementiert, um XAML suchen.
Mit den gegebenen Einschränkungen können Sie das XML-Element finden, das einen untergeordneten Namen hat.

Sie folgenden Code verwenden können: Es werden alle Elemente zurückgeben Kind Element, das Name endet mit .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; 
      } 
     } 
    } 

Um sicherzustellen, dass das Objekt durch dieses Element dargestellt implementiert eine Schnittstelle, die Sie lesen müssen Metadaten von Ihren Assemblys. Ich würde Ihnen empfehlen, Mono.Cecil-Framework zu verwenden, um Typen in Ihren Assemblys zu analysieren, ohne Reflektion zu verwenden.

0

@aku
Ja, ich weiß, dass XAML keine Angabe von Basistypen oder Schnittstellen enthält. Aber ich kenne die Schnittstelle der Stammobjekte und die Schnittstelle, die die Auflistung enthält, zum Zeitpunkt der Kompilierung.

Die serialisierten Diagramme werden in einer SQL-Datenbank als XML gespeichert und wir verwenden linq, um sie als XElements abzurufen. Derzeit beschränken wir uns zusammen mit Ihrer Lösung darauf, die Diagramme zu deserialisieren, sie zu durchlaufen, die gewünschten Objekte aus der Sammlung herauszuziehen, alle Referenzen darauf zu entfernen und dann deren Eltern zu entsorgen. Es ist alles sehr kludgy. Ich habe auf eine Single-Stroke-Lösung gehofft; etwas in der Art eines xpath, aber inline mit unserer Abfrage linq to sql, die nur die Elemente zurückgibt, die wir suchen ...