Announcement

Collapse
No announcement yet.

XML-Serialisierung

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • XML-Serialisierung

    Hallo zusammen,

    Komme bei einem Projekt leider nicht mehr weiter und hoffe nun Hilfe hier zu finden.
    Ein Objekt meines Programmes soll gemäß eines XML-Schemas, was mir als xsd-Datei vorliegt, "exportiert" werden. Diese XML-Datei soll anschließend von einer anderen Applikation eingelesen werden können, deshalb ist es notwenig dass die XML-Datei diesem Schema entspricht. Leider weiß ich nicht wie ich hier rangehen soll. Bisher habe ich die "Exportfunktion" manuell durch XElement/XAttribut gelöst, was sich jedoch als recht aufwendig erwies.
    Über Tipps und Links zu diesem Thema wäre ich sehr Dankbar.

  • #2
    Hallo,

    für die XML-Serialisierung gibt es die XmlSerializer-Klasse. Mit der kann auch ein Schema angegeben werden.

    mfG Gü
    "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

    Comment


    • #3
      Nimm dein xsd Schema und erzeuge dir daraus eine c# Klassenstruktur (das macht man z.B. mit der xsd.exe aus dem Framework). Diese kannst du dann mit deinen Daten füllen und über den von Gü angesprochenen XMLSerializer in ein xsd konformes xml serialisieren.

      Comment


      • #4
        Vielen Dank für den Tipp, ich glaub so funktioniert es

        Comment


        • #5
          Stoße jetzt leider auf andere Probleme, für die ich keine Antwort finde, deshalb hoffe ich nun, dass mir hier jemand weiterhelfen kann.
          Die neu generierte Klasse enthält nun ein Jagged Arrays, das nicht serialisierbar ist.
          Schon beim Ausführen des Codes
          Code:
          XmlSerializer xmlSerial = new XmlSerializer(typeof(NewDataSet))
          wird eine Exception angezeigt:


          "InvalidOperationException wurde nicht behandelt"
          Temporäre Klasse kann nicht generiert werden (result=1).
          error CS0030: Der Typ MyNewClass[] kann nicht in MyNewClass konvertiert werden.
          error CS0029: Der Typ MyNewClass kann nicht implizit in MyNewClass[] konvertiert werden.


          Bin im Internet und hier leider nicht fündig geworden, wie ich dieses Problem umgehen könnte.

          Comment


          • #6
            Mehrdimensionale/jagged Arrays sollten kein Problem sein.

            Beispiel (auskommentiert sind die zusätzlichen Attribute für die Serialisierung welche die Ausagabe beeinflussen):
            Code:
            using System;
            using System.IO;
            using System.Xml.Serialization;
            
            namespace ConsoleApplication1
            {
            	class Program
            	{
            		static void Main(string[] args)
            		{
            			MyClass myClass = new MyClass();
            			myClass.MyArray = new int[][]
            			{
            				new int[] {1, 2},
            				new int[] {4, 5, 6},
            				new int[] {7}
            			};
            
            			XmlSerializer xmlSer = new XmlSerializer(typeof(MyClass));
            			MemoryStream ms = new MemoryStream();
            			xmlSer.Serialize(ms, myClass);
            			ms.Position = 0;
            			StreamReader sr = new StreamReader(ms);
            			string xml = sr.ReadToEnd();
            			Console.WriteLine(xml);
            			Console.ReadKey();
            		}
            	}
            
            	//[Serializable()]
            	//[XmlRoot("MeineKlasse")]
            	public class MyClass
            	{
            		//[XmlArray("MeinArray")]
            		//[XmlArrayItem("Element")]
            		public int[][] MyArray { get; set; }
            	}
            }
            Wahrscheinlich hast du dein Array falsch deklariert/erzeugt. Da du es uns nicht zeigts kann ich eben nur vermuten. Hintergrundinfos dazu zB http://entwickler-forum.de/showthread.php?t=51153

            mfG Gü
            "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

            Comment


            • #7
              Das mit den Jagged-Arrays hat mitlerweile funktioniert...
              Allerdings habe ich bei der Erstellung mit VS weitere Problem. Hierbei kann ich alle inneren Elemente definieren. Wie ich jedoch meinem Root-Element, das Serialisiert werder soll, diese inneren Elemente zuweise kann ist mir bisher noch ein Rätsel.
              Beim Anlegen der Datei durch XSD.exe wird für das Root-Element die Klasse NewDataSet erzeugt. Diese Klasse besitzt nun ein Attribut, das eben die Internen Elemente enthalten soll. Da jedoch VS noch eine Designer-Datei anlegt, die eine Erweiterung der NewDataSet (durch partial Class) beinhaltet, ist es nicht mehr möglich, diesem Attribut, die inneren Elemente zuzuweisen.
              Bisher habe ich selten partial Klassen eingesetzt, wenn jedoch, dann hat dies super als erweiterung funktioniert. Hier ignoriert er einen Teil, eben den wichtigen, komplett. Namespace und Namen stimmen alle überein.
              Kann mir bei diesem Problem jemand weiterhelfen?
              Vielen Dank

              Comment


              • #8
                Das Root-Element wird wie im obigen Beispiel durch das Attribut XmlRoot() festgelegt (im Bsp auskommentiert). Somit wird die Klasse welche die Eigenschaften zur Serialisierung definiert als Wurzel verwendet mit dem angegeben Namen.

                mfG Gü
                "Any fool can write code that a computer can understand. Good programmers write code that humans can understand". - Martin Fowler

                Comment

                Working...
                X