2009-07-30 14 views
0

Im ersten Szenario ist alles ziemlich einfach, ich habe das folgende XML, das ich zu einem starken Typ deserialisieren kann.Deserialisieren von dynamischem XML

<providers> 
    <dprovider> 
     <dimensions> 
     <width></width> 
    </dimensions> 
    </dbrovider> 

Im zweiten Szenario, und das ist, wo ich Hilfe brauche ... Ich habe etwas mehr Dynamik

<providers> 
    <dprovider> 
     <dimensions> 
     <width></width> 
    </dimensions> 
    </dbrovider> 
    <dprovider> 
     <dimensions> 
     <height></height> 
    </dimensions> 
    </dbrovider> 

Wie Sie die Dimensionen sehen Die Unterstruktur ist in beiden Items unterschiedlich, daher muss ich eine Möglichkeit finden, die stark typisierte Klasse zu erstellen, so dass sie jede Änderung am Dimensions-Element behandeln kann, sie könnte beispielsweise ein wh enthalten ole geschachtelte Unterstruktur, unterschiedlich für jeden dbprovider.

Irgendwelche Ideen, wie das gemacht wird?

Antwort

2

Try this:

[Serializable] 
class Dimension { ... } 

[Serializable] 
class Height : Dimension { ... } 

[Serializable] 
class Width : Dimension { ... } 

Dann in der Klasse, die Ihre (man beachte den Plural) Element deserialisiert in, haben diese Eigenschaft:

[XmlElement(Type = typeof(Height), ElementName = "height")] 
[XmlElement(Type = typeof(Width), ElementName = "width")] 
public Dimension[] DimensionArray { 
    get { ... } 
    set { ... } 
} 

Hier ist der Ausgangspunkt von documentation on XML serialization (XmlElement Klasse), damit Sie den Rest der Details herausfinden können.

Sie sollten Ihr Provider-Objekt serialisieren/deserialisieren können, indem Sie einfach die richtigen Eigenschaften und Klassen mit den richtigen Attributen aus dem Systemnamen System.Xml.Serialization dekorieren.

0

Das erste, was mir in den Sinn kommt, ist die benutzerdefinierte Deserialisierung. An diesem Punkt kann Ihre Dprovider-Klasse eine Liste <Objekt> genannt Dimensions haben, die den Host von Unterjobs, die Sie benötigen, hat. Der einzige Schmerz ist, sie wieder herauszuziehen, weil du eine Menge "Ist" -Logik machen musst.

Wenn Sie nach einer "vollständig geschachtelten Unterstruktur" suchen, sollte diese Unterstruktur als eigene Klasse/Struktur definiert und dann zur Dimensionsliste hinzugefügt werden.

+0

Wenn ich eine Objektliste habe, dann -> Ich denke, ich kann jedes Objekt mit irgendeiner Struktur in dieser Sammlung halten? –

+0

Genau, aber ich bin mir nicht sicher, ob dies Ihre Anforderung erfüllt "muss stark typisiert werden", da Ihr Code wie folgt aussehen wird: if (dProvider.Dimensions [0] ist ObjWithHeight) height = ((ObjWithHeight) dProvider.Dimensions [0]). Höhe; Das Casting jedes Mal zu tun ist ein königlicher Schmerz. Wenn Sie genauer erklären möchten, was Ihr Endziel ist (und nicht die von Ihnen gewählte Methode), könnte es eine andere Methode geben, die die Community vorschlagen könnte als benutzerdefinierte Deserialisierung + Objektliste + Casting. – JustLoren

1

Ich denke, dass Sie den Punkt von C# zu XML Serialisierung/Deserialisierung vermissen.

Sie sollten entweder ein Schema definieren (oder das bereits vorhandene Schema verwenden) und eine C# -Klasse erstellen, die es unterstützt. See MSDN article on xsd.exe

Die andere Route besteht darin, Ihre C# -Klasse zu erstellen (und in eine Sammlung von Ihrem Markup zu verpacken) und XML-Attribute hinzuzufügen. Dies definiert im Wesentlichen Ihr XML-Schema.

+0

Sie können den DataContractSerializer verwenden, der Sammlungen besser als der normale XML-Serializer verarbeiten kann. Ich kann nicht sagen, ob Sie es brauchen. –

Verwandte Themen