Laden...

xml deserialisieren

Erstellt von MHI vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.322 Views
M
MHI Themenstarter:in
8 Beiträge seit 2010
vor 11 Jahren
xml deserialisieren

verwendetes Datenbanksystem: MS-SQL, MySQL, SAP-DB(MaxDB)

Hallo Zusammen,
ich verwende die XmlSerializer-Klasse um XML zu deserialisieren. Das klappte bislang auch immer wunderbar, allerdings bin ich nun auf ein Problem gestoßen dem ich offenbar nicht gewachsen bin.
Ich bekomme eine XML-Struktur, die ich nicht deserialisiert bekomme. Das XML enthält zahlreiche Elemente <list> die jeweils unterItems <item> haben oder leer sind. Einige der <list>-Elemente sind direkt unterhalb des root-Knotens, getrennt durch andere Elemente, einige der <list>-Elemente befinden sich tiefer in der Struktur.
Innerhalb der <list>-Elemente befinden sich jeweils andere Strukturen. Das kann von reinem Text bis hin zu verschachtelten Elemente-Bäumen alles mögliche sein.

Da der <item> Inhalt jeweils so unterschiedlich ist, ist der einzige Weg den ich bislang gefunden habe, die Definition von

[XmlElement("list")]
public List<Liste> preise;

unter dem Class-Root und die definition der Klasse

public class Liste
        {
            public Liste()
            {

            }
            public object item;
}

Dabei bleibt der Inhalt der <list>-Elemente allerdings un-deserialisiert, was nicht zufriedenstellend ist.

Hier noch ein Beispiel XML:


<root>
  <test>Hallo</test>
  <id>5</id>
  <list name="emailadressen">
    <item>
      <emailadressen>
        <email type="VARCHAR (255)">test@example.org</email>
        <zweck type="VARCHAR (255)" />
      </emailadressen>
    </item>
  </list>
  <element>false</element>
  <list name="subdomains">
    <item id="47">
      <subdomains>
        <subdomain type="VARCHAR (255)">subdomain</subdomain>
        <selected type="BIT (1)">false</selected>
      </subdomains>
    </item>
  </list>
  <koordinaten>
    <latitude type="FLOAT (20)">48.493</latitude>
    <longitude type="FLOAT (20)">9.387</longitude>
  </koordinaten>
  <list name="naechste_print">
    <item id="113">
      <hb>
        <entfernung type="INTEGER (10)">29868</entfernung>
      </hb>
    </item>
    <item id="122">
      <hb>
        <entfernung type="INTEGER (10)">34179</entfernung>
      </hb>
    </item>
    <item id="104">
      <hb>
        <entfernung type="INTEGER (10)">38201</entfernung>
      </hb>
    </item>
  </list>
</root>

Wie stellt man es an, dass der Serialisierer "merkt" welcher typ von "<list>" zu deserialisieren ist?

A
764 Beiträge seit 2007
vor 11 Jahren

Hallo MHI,

kannst du die Struktur der XML noch definieren?

So wie die XML jetzt ist, könntest du pro Liste List<Item> machen. Und Item ist eine Klasse, die die Klassen emailadressen, subdomains und hb enthält.

Gruß, Alf

M
MHI Themenstarter:in
8 Beiträge seit 2010
vor 11 Jahren

Hallo Alf Ator,
das XML kommt aus einer Schnittstelle, auf die ich leider keinen Einfluss habe.

Du meinst also, ich soll eine Item-Klasse einfügen, die die alle Möglichkeiten beinhaltet die vorkommen "könnten"?

Gruß MHI

A
764 Beiträge seit 2007
vor 11 Jahren

Du meinst also, ich soll eine Item-Klasse einfügen, die die alle Möglichkeiten beinhaltet die vorkommen "könnten"?

Ja, ich denkte das wird so relativ unkompliziert funktionieren.

16.834 Beiträge seit 2008
vor 11 Jahren

Bei so einer XML würde ich manuell serialisieren; nicht automatisch.
Sprich, von Hand alles parsen.

A
350 Beiträge seit 2010
vor 11 Jahren

Dafür werde ich sicher erschlagen aber :
Was ist mit dem ganzem Dokument einelsen und dann per XPath drauf zugreifen ?

Die XPath Pfade kannst du dir in Konstanten oder ähnliches packen.