2017-09-13 1 views
0

Ich versuche eine generische Klassenstruktur zu erstellen, um Listen mit verschiedenen Unterelementen in einer XML-Datei als XML-Attribute zu speichern. Jede Unterposition hat Name (string) und einen Wert (double).C# XML-Serialisierung verschiedener Unterelemente in Liste als XML-Attribute

Ein Beispiel: Das XML von zwei Listen - Frame 1 und Frame 2 - sollte wie oben gezeigt aussehen. Der frame1 ist eine Liste der Klasse rec. Die Klasse rec enthält immer mehrere Parameterpaare und ihre Werte. In Frame1 enthält die Klasse rec die Parameter Auto, Fabrik und Höhe. Und in frame2 Buch und Seite.

<frame1> 
     <rec car="0" factory="1" height="2" /> 
     <rec car="1" factory="4" height="2" /> 
     <rec car="2" factory="4" height="3" /> 
     <rec car="3" factory="5" height="2" /> 
    </frame1> 
    <frame2> 
     <rec book="0" page="1" /> 
     <rec book="1" page="4" /> 
     <rec book="2" page="4" /> 
     <rec book="3" page="5" /> 
    </frame2> 

Dies ist nur ein Beispiel. Ich möchte nicht verschiedene Klassen mit unterschiedlichen Eigenschaften für jede "Rahmen" -Liste erstellen. Ich möchte das Problem mit einer Klasse "rec" lösen, da sich die Unterelemente ständig ändern. Gibt es eine Möglichkeit, dies zu schaffen?

Vielen Dank im Voraus

+0

Antwort hängt davon ab, wie wollen Sie, dass xml verwenden. Sie können eine solche Struktur erstellen [manuell] (https://stackoverflow.com/q/284324/1997232), aber ... – Sinatr

+0

Ist es in beiden Fällen die gleiche 'rec' Klasse in C#? –

+0

Verwenden Sie ein Dictionary für die Klassenattribute rec. – jdweng

Antwort

0

Ich glaube, Sie einen Code wie folgt verwenden: lists ein object[][] ist, so keine generische Typen benötigt.

using System.Xml.Linq; 

... 

var lists = new[] 
       { 
        new object[] 
         { 
          new ClassA("0", "1", "2"), new ClassA("1", "4", "2"), new ClassA("2", "4", "3"), 
          new ClassA("3", "5", "2"), 
         }, 
        new object[] 
         { 
          new ClassB("0", "1"), new ClassB("1", "4"), new ClassB("2", "4"), 
          new ClassB("3", "5"), 
         } 
       }; 

var xml = new XDocument(new XElement("Root")); 
for (var i = 0; i < lists.Length; i++) 
{ 
    var eFrame = new XElement($"frame{i}"); 
    var list = lists[i]; 
    foreach (var obj in list) 
    { 
     var eRec = new XElement("rec"); 
     var props = obj.GetType().GetProperties(); 
     foreach (var prop in props) 
     { 
      eRec.SetAttributeValue(prop.Name, prop.GetValue(obj).ToString()); 
     } 

     eFrame.Add(eRec); 
    } 

    xml.Root.Add(eFrame); 
} 

Ergebnis wird in etwa so wie xml Objekt sein:

<Root> 
    <frame0> 
    <rec car="0" factory="1" height="2" /> 
    <rec car="1" factory="4" height="2" /> 
    <rec car="2" factory="4" height="3" /> 
    <rec car="3" factory="5" height="2" /> 
    </frame0> 
    <frame1> 
    <rec book="0" page="1" /> 
    <rec book="1" page="4" /> 
    <rec book="2" page="4" /> 
    <rec book="3" page="5" /> 
    </frame1> 
</Root> 
Verwandte Themen