Laden...

XML deserialisieren

Erstellt von armerTropf vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.207 Views
A
armerTropf Themenstarter:in
6 Beiträge seit 2009
vor 15 Jahren
XML deserialisieren

verwendetes Datenbanksystem: XML

Hallo zusammen,

bin ein bisschen ratlos, und hoffe ihr könnt mir weiterhelfen....
Ich habe eine xml Datei, die ich deserialisieren möchte.
Teilweise klappt das auch....also mit meiner Test Datei hat es funktioniert...und die sah so aus:

Meine Spec.cs, die die xml abbildet:


    [Serializable]
    [XmlRoot("Spec")]
    public class Spec
    {
        [XmlElement("server")]
        public ServerXml server;
    }

    [XmlRoot("server")]
    public class ServerXml
    {
        [XmlAttribute("id")]
        public int id;
        [XmlElement("name")]
        public string name;
        [XmlElement("port")]
        public int port;
        [XmlElement("ip")]
        public string ip;
        [XmlElement("username")]
        public string userName;
        [XmlElement("pass")]
        public string password;
    }

meine dazugehörige XML:


<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE srv[
<!ATTLIST server id ID #IMPLIED>
]>
<Spec>
  <server id="1">
    <name>Server Nr. 1</name>
    <port>1234</port>
    <ip>127.0.0.1</ip>
    <username>testuser</username>
    <pass>testpass</pass>
  </server>  
</Spec>

mein Code in C#:


 XmlSerializer serializer = new XmlSerializer(typeof(Spec));
 Spec setupXml = (Spec)serializer.Deserialize(File.OpenText(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Test.xml"));

Jo da funktioniert das alles recht schön, aber nun wollt ich das Ganze auf meine vorhandene XML anpasen und nix geht mehr Habe die xml schon sehr verkürzt, aber selbst da gibt's Probleme... 🙁

Spec.cs, die die xml abbildet:


[Serializable]
    [XmlRoot("Spec")]
    public class Spec
    {
        public Protocol protocol;
    }

    [XmlRoot("Protocol")]
    public class Protocol
    {
        [XmlAttribute("id")]
        public int id;

        public Common common;
    }

    [XmlRoot("Common")]
    public class Common
    {
        [XmlElement("MaxResponseLen")]
        public int maxResponseLen;

        [XmlElement("PositiveResponseOffset")]
        public byte positiveResponseOffset;

        [XmlElement("NegativeResponseId")]
        public byte negativeResponseId;

        [XmlElement("ResponseHandler")]
        public String responseHandler;
    }

xml Datei:


<Spec>
  <Protocol id="Testprotocol">			
     <Common>
       <MaxResponseLen>255</MaxResponseLen>
       <PostiveResponseOffset>0x40</PostiveResponseOffset>
       <NegativeResponseId>0x7f</NegativeResponseId>
       <ResponseHandler>rh_protocol.xml</ResponseHandler>
    </Common>
  </Protocol>
</Spec>

Der Code zum Deserialisieren ist ja gleich geblieben...
Auf jeden Fall bekomm ich in diesem Fall für mein Objekt "Spec setupXml" immer protocol = null raus...warum??? X(

Vielleicht sieht von Euch jemand meinen Fehler...wäre echt sehr dankbar.

Gruß

456 Beiträge seit 2007
vor 15 Jahren

Also ich hatte da noch nie Probleme beim Mappen. Auf den ersten Blick würde ich sagen, dass ich das XmlRoot-Attribute nur einmal bei einer Klasse verwende und bei den restlichen Klassen immer XmlElement.

Gruß

3.971 Beiträge seit 2006
vor 15 Jahren

jag mal zum testen xsd.exe über die Xml-Datei und vergleiche was das MS-Tool generiert hat und was du.

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

A
armerTropf Themenstarter:in
6 Beiträge seit 2009
vor 15 Jahren

Hallo also mittel xsd kommt folgendes raus...


<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="Spec" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="Spec" msdata:IsDataSet="true" msdata:Locale="en-US">
    <xs:complexType>
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element name="Protocol">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Common" minOccurs="0" maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="MaxResponseLen" type="xs:string" minOccurs="0" />
                    <xs:element name="PostiveResponseOffset" type="xs:string" minOccurs="0" />
                    <xs:element name="NegativeResponseId" type="xs:string" minOccurs="0" />
                    <xs:element name="ResponseHandler" type="xs:string" minOccurs="0" />
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
            <xs:attribute name="id" type="xs:string" />
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

Hab aber noch nie damit gearbeitet, bin daher bissel überfordert, was ich daraus nun erkennen kann, im Vergleich zu meiner Datei 🤔

B
3 Beiträge seit 2009
vor 15 Jahren

Du gibst das "ID" XMLAttribut in deiner Klasse als INT an, in deinem XML-File haste aber einen String.
Eigtl. sollte dir der Serializer aber auch nen Output in den Debugger geben.

A
armerTropf Themenstarter:in
6 Beiträge seit 2009
vor 15 Jahren

Hallo Bopperty,

dank für den Hinweis...hab ich soeben mal korrigiert und nochmal getestet...macht aber leider keinen Unterschied.

habe auch mal alle als String definiert, weil bei dem xsd überall String raus kam, aber auch da leier ohne Erfolg...ist momentan echt mehr so ein rumprobieren, weil ich nicht mehr weiter weiß....

Muss ich wohl weiter suchen und rumprobieren.... 🙁

3.971 Beiträge seit 2006
vor 15 Jahren

Benutz mal xsd.exe /c

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

B
3 Beiträge seit 2009
vor 15 Jahren

Der XML Serializer ist eigentlich recht gutmütig und sooo viel zu lesen gibts da auch nicht, aber in der MSDN findest du sicher Anhaltspunkte.

Aber um auf mosspower zurück zu kommen, weils plausibel ist.
Zitat MSDN: "XmlRootAttribute kann nur auf eine einzige Klasse angewendet werden: auf die Klasse, die bei Serialisierung das öffnende und schließende Element, d. h. das Stammelement, darstellt"

Eigentlich vermisse ich auch noch die Serializable Attribute der Common und Protocol Klasse.

A
armerTropf Themenstarter:in
6 Beiträge seit 2009
vor 15 Jahren

Hi kleines_eichhoernchen,

vielen Dank...der Tipp war Gold wert..habe nun als über meine xml Datei eine .xsd und darüber eine .cs generieren lassen. Und wenn ich die einfach nehme und einbinde funktioniert es....

Jetzt werde ich mal schauen, was so die Unterschiede zu meiner .cs sind, aber notfalls kann ich ja auf die generierte zugreifen.

@ Bopperty...ja u.a. fehlen bei mir die Serializabel Attribute... aber ich glaub das ist nicht alles...die generierte Klasse sieht schon ein wenig komplexer aus als meine...

Vielen vielen Dank.

B
3 Beiträge seit 2009
vor 15 Jahren

@ Bopperty...ja u.a. fehlen bei mir die Serializabel Attribute... aber ich glaub das ist nicht alles...die generierte Klasse sieht schon ein wenig komplexer aus als meine...

Vielen vielen Dank.

Genau das ist das Problem beim generieren 😉

A
armerTropf Themenstarter:in
6 Beiträge seit 2009
vor 15 Jahren

Ja glaub auch....
wenn ich meine komplette .xml Datei nehm und alles generieren lass, krachts auch schon wieder 😃

Jo jo, wird glaub noch ne spannende Geschichte....

A
armerTropf Themenstarter:in
6 Beiträge seit 2009
vor 15 Jahren

Also habe es hinbekommen...danke für Eure Tippps...waren wichtige Meilensteine zum Erfogl 👍