Automapper zum Erstellen eines Objekts aus XML

7

Wenn ich die folgende Klasse habe:

%Vor%

Und ich verwende die Sharepoint-Webdienste, die ein XML mit einem Attribut für jede Eigenschaft meiner Klasse zurückgeben, wie zum Beispiel:

%Vor%

Gibt es eine Möglichkeit, AutoMapper zu verwenden, um das XML-Fragment einer SPUser -Klasseninstanz zuzuordnen?

    
Darbio 01.07.2011, 04:42
quelle

4 Antworten

8

Blog wurde gelöscht - hier ist das Bing-Archiv des Posts von @DannyDouglass

Vereinfachen Sie die Verwendung von Xml-Daten mit AutoMapper und Linq-to-Xml

Ich habe kürzlich ein Szenario bei der Arbeit kennengelernt, bei dem mehrere SOAP-Webdienste manuell in Anspruch genommen werden mussten. Ich bin mir sicher, dass Sie sich das als ziemlich eintönig vorstellen. Ein Mitarbeiter (Seth Carney) und ich versuchten ein paar verschiedene Ansätze, aber wir entschieden uns schließlich für eine Lösung, die den Verbrauch der XML-Datei vereinfachte und schließlich den Code testbarer machte. Bei dieser Lösung ging es um den Einsatz von AutoMapper, einem Open-Source-Objekt-Objekt-Mapping-Tool, um eine Verknüpfung zwischen den XElements zu erstellen ( Ссылка ) zurückgegeben in den SOAP-Nachrichten und benutzerdefinierte Verträge, die wir erstellt haben - in einer wiederverwendbaren Art und Weise.

Ich habe eine kurze Demo zusammengestellt, die zeigt, wie Sie die öffentliche Zeitleiste von Twitter verwenden und anzeigen können ( Ссылка ) (unter Verwendung des Xml-Antworttyps der API).

Hinweis: Der Quellcode für das folgende Beispiel kann auf meiner GitHub-Seite gefunden werden: Ссылка

  1. Abrufen des Projekt-Setups

Nach dem Erstellen eines grundlegenden MVC3-Projekts (Beta-Download) und des zugehörigen Testprojekts war der erste Schritt, das AutoMapper-Paket zu installieren. Ich benutze NuGet, das kürzlich angekündigte Paketverwaltungssystem von Microsoft, um jegliche Open-Source-Abhängigkeiten zu installieren. Der folgende Befehl war alles, was benötigt wurde, um AutoMapper in meinem MVC3-Projekt einzurichten (lesen Sie mehr über NuGet hier ( Ссылка ) und hier ( Ссылка )):

%Vor%
  1. Erstellen der Zuordnung

Wenn AutoMapper installiert ist, kann ich mit dem Erstellen der für die XML-zu-Objekt-Zuordnung erforderlichen Komponenten beginnen. Der erste Schritt besteht darin, einen schnellen Vertrag zu erstellen, der in meiner Anwendung verwendet wird, um das Tweet-Objekt darzustellen:

%Vor%

Nichts Verrücktes hier - nur eine einfache Einheit. Dies sind alle Felder, die in der Antwort von der Twitter-API unter Verwendung eines anderen Namens für einige Felder bereitgestellt werden. In einfachen Fällen, in denen die Quell- und Zielobjekte denselben Namen haben, können Sie eine Karte sehr schnell mit dieser Syntax einrichten:

%Vor%

AutoMapper unterstützt jedoch Xml standardmäßig nicht. Ich muss die Felder angeben, die ich zuordnen werde. Mit der Fluent-API in AutoMapper kann ich meine Feldzuordnungen verketten. Sehen Sie sich ein Beispielfeld an, das in meinem Beispiel abgebildet ist - den Body des Tweets:

%Vor%

Es mag zunächst kompliziert aussehen, aber hier geschieht nur, dass wir AutoMapper Details darüber zur Verfügung stellen, welchen Wert ich in meinem Quellobjekt verwenden soll und wie es der Eigenschaft des Zielobjekts zugeordnet wird. Es gibt eine bestimmte Zeile, auf die ich mich im obigen Body-Feld-Mapping konzentrieren möchte:

%Vor%

Der XElementResolver ist ein benutzerdefinierter Wert-Resolver ( Ссылка ), den Seth entwickelt hat Analysieren des XmlElement-Quellobjekts, um einen stark typisierten Wert für die Verwendung im Mapping abzurufen. Ich werde das in einem Moment genauer beschreiben, aber bevor wir weitermachen, werfen Sie einen Blick auf mein vollständiges Mapping:

%Vor%
  1. Der generische XElementResolver

Dieser benutzerdefinierte Wert-Resolver ist der echte Schlüssel, mit dem diese XElement-to-Contract-Maps in der ursprünglichen Lösung funktionieren. Ich habe diesen Resolver in diesem Beispiel wie oben beschrieben wieder verwendet. Das war alles, was zum Erstellen der benutzerdefinierten Resolver-Klasse erforderlich war:

%Vor%

Dieser generische XElementResolver ermöglicht es, den Typ des in unserer obigen Abbildung abgerufenen Wertes einfach zu übergeben. Beispielsweise wird die folgende Syntax verwendet, um den Wert, der aus dem XmlElement abgerufen wird, in der obigen Deklaration .ForMember () des ID-Felds zu schreiben:

%Vor%

Wenn mein Mapping vollständig konfiguriert und instanziiert ist, kann ich die Twitter-API aufrufen und AutoMapper verwenden, um die neueste öffentliche Zeitleiste anzuzeigen.

  1. Die Stücke zusammenfügen

Ich habe eine einfache Klasse erstellt, die für das Abrufen der Twitter-API-Antwort verantwortlich ist:

%Vor%

Die GetPublicTimeline-Methode ist eine einfache Methode, die, wie Sie es erraten haben, die öffentliche Zeitleiste von Twitter unter Verwendung der zuvor erstellten Karte zurückgibt:

%Vor%

Im HomeController meiner MVC3-Site kann ich schnell die Abrufmethode aufrufen und die letzten 10 Ergebnisse anfordern:

%Vor%

Und schließlich, nach ein wenig Formatierung in meiner Ansicht mit der neuen Razor View-Engine von Microsoft, habe ich meine öffentliche Zeitleiste angezeigt!

    
OzBob 16.12.2014, 09:35
quelle
7

Sie müssen XML-Serialisierung in .NET auschecken - das ist der richtige Weg Serialisierung eines Objekts in XML oder Deserialisierung aus XML.

Automapper kann verwendet werden, um Eigenschaften zwischen zwei Objekten zu setzen - es geht überhaupt nicht um XML.

Weitere Ressourcen:

marc_s 01.07.2011 05:00
quelle
4

Bit spät am Tag, aber jemand hat AutoMapper verwendet, um XML einem POCO zuzuordnen, anstatt die XMLSerialization-Route zu durchlaufen. Ich habe den folgenden Blogeintrag gefunden: - Vereinfachen Sie die Verwendung von Xml-Daten mit AutoMapper und Linq-to- Xml

Dies reicht aus, um mit der Implementierung eines eigenen generischen benutzerdefinierten Resolvers zu beginnen, wenn das Beispiel nicht ausreicht.

EDIT: feste Verbindung EDIT: wirklich fester Link

    
Ricardo Campos 19.12.2011 16:10
quelle
1

Sie können zu diesem Zweck die XML-Deserialisierung verwenden. In .NET haben wir XmlSerializer und DataContractSerializer

    
Kirill Polishchuk 01.07.2011 05:01
quelle