2012-04-04 2 views
1

Arbeiten mit C# Visual Studio 2008, MVC1.Deserialize on the fly oder LINQ to XML

Ich erstelle eine XML-Datei, indem ich eine von einem WebService abrufe und einige Knoten hinzufüge. Jetzt wollte ich es zu einer Klasse deserialisieren, die das Modell verwendet, um die Ansicht zu stark zu typisieren.

Zunächst habe ich Probleme, dies zu erreichen, ohne die XML im Dateisystem zu speichern, weil ich nicht weiß, wie diese serialisieren und deserialize arbeiten. Ich denke, es gibt einen Weg und es ist eine Frage der Zeit.

Aber auf der Suche nach dem vorherigen im Web kam ich über LINQ zu XML und jetzt bezweifle ich, ob es besser ist, es zu verwenden.

Die XML würde von einigen Kunden Details gebildet werden, und im Grunde werde ich alle von ihnen verwenden.

Irgendwelche Hinweise?

Danke !!

Antwort

1

Sie können eine XElement zu und von einem MemoryStream (keine Notwendigkeit, es zu einem Datei-Stream zu speichern) speichern

MemoryStream ms = new MemoryStream(); 
XmlWriter xw = XmlWriter.Create(ms); 
document.Save(xw); 
xw.Flush(); 

Dann, wenn Sie die Position auf 0 zurückgesetzt, können Sie es deserialisieren die DataContractSerializer verwenden.

ms.Position = 0; 
DataContractSerializer serializer = new DataContractSerializer(typeof(Model)); 
Model model = (model) serializer.ReadObject(ms); 

Es gibt auch andere Möglichkeiten, wie die Serialisierung funktioniert, also, wenn dies ist nicht das, was Sie haben, lassen Sie mich wissen, was Sie und ich werde Ihnen helfen.

+0

Vielen Dank gbanfill, die Sache ist, dass ich einen Fehler von Namespace bekomme, aber es scheint ein Schritt vorwärts zu sein – mitomed

1

versuchen Sie dies:

XmlSerializer xmls = new XmlSerializer(typeof(XElement)); 
FileStream FStream; 
try 
{    
    FStream = new FileStream(doctorsPath, FileMode.Open); 
    _Doctors = (XElement)xmls.Deserialize(FStream); FStream.Close(); 
    FStream = new FileStream(patientsPath, FileMode.Open); 
    _Patients = (XElement)xmls.Deserialize(FStream) 
    FStream.Close(); 
    FStream = new FileStream(treatmentsPath, FileMode.Open); 
    _Treatments = (XElement)xmls.Deserialize(FStream); 
    FStream.Close(); 
} 
catch 

{ } 

Dies wird alle XML-Dateien in unsere XElement Variablen laden. Der try-catch-Block ist eine Form der Ausnahmebehandlung, die sicherstellt, dass, wenn eine der Funktionen im try-Block eine Ausnahme auslöst, das Programm zum Catch-Abschnitt springt, in dem nichts passiert. Bei der Arbeit mit Dateien, insbesondere beim Lesen von Dateien, ist es eine gute Idee, mit try - catch zu arbeiten.

1

LINQ to XML ist eine hervorragende Funktion. Darauf können Sie sich immer verlassen. Sie müssen nicht schreiben oder lesen oder Daten aus der Datei. Sie können entweder eine Zeichenfolge oder einen Stream für das XDocument angeben

Es gibt genügend Möglichkeiten, ein XML-Element in das XDocument-Objekt zu laden. See the appropriate Load functions. Sobald Sie den Inhalt geladen haben, können Sie die Elemente leicht hinzufügen/entfernen und später können Sie auf der Festplatte speichern, wenn Sie möchten.