none
XML-Ausgabe von DBNull-Werten RRS feed

  • Frage

  • Hallo NG,
    wenn wir eine Datenbankabfrage in ein DataSet machen und dieses dann per WriteXml schreiben, werden die Knoten, die NULL-Werte haben weggelassen.
    War bisher kein Problem, solange wir mit .NET und ein Schema haben arbeiten.

    Nun soll diese Datei aber in Navision eingelesen werden. Ist zwar auch ein Produkt von MS, aber es verlangt immer den Knoten, wie z.B. <Name/>, auch bei NULL-Werten.
    Nun kann man in der SQL-Abfrage alle Werte mit IsNULL() abfangen. In der Schema-Definition ist mir noch nichts aufgefallen, das dieses Problem löst.

    Gibt es eine Möglichkeit. dass bei WriteXml  die NULL-Werte als leere Knoten geschrieben werden?

    Uwe


    Mittelung vom Forum

    Mittwoch, 17. Oktober 2018 13:08

Antworten

  • Hi Uwe,
    wenn Ihr anstelle eines DataSets mit seinen Standardabläufen das EF zum Laden der Daten nutzt, dann könnt Ihr mit einem XmlSerializer das Problem lösen, indem die Datenklassen entsprechend gestaltet werden. Dazu mal eine Demo:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using System.Xml;
    using System.Xml.Serialization;
    
    namespace ConsoleApp1
    {
      public class Program48
      {
        static void Main(string[] args)
        {
          try
          {
            Demo c = new Demo();
            c.Execute();
          }
          catch (Exception ex) { Console.WriteLine(ex.ToString()); }
          Console.WriteLine("Fertig, Abschluss mit beliebiger Taste");
          Console.ReadKey();
        }
    
        class Demo
        {
          internal void Execute()
          {
            List<Data> liste = new List<Data>();
            for (int i = 1; i < 10; i++) liste.Add(new Data() { ID = i });
            XmlSerializer ser = new XmlSerializer(typeof(List<Data>));
            using (MemoryStream ms = new MemoryStream())
            {
              ser.Serialize(ms, liste);
              Console.WriteLine(Encoding.Default.GetString(ms.ToArray()));
            }
          }
        }
        public class Data
        {
          public int ID { get; set; }
    
          private string _data;
          [XmlElement(IsNullable = true)]
          public string Info
          {
            get { return string.IsNullOrEmpty(this._data) ? string.Empty : this._data; }
            set { if (this._data != value) this._data = value; }
          }
        }
      }
    }
    


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert uwe domschke Mittwoch, 17. Oktober 2018 15:38
    Mittwoch, 17. Oktober 2018 14:46

Alle Antworten

  • Hi Uwe,
    wenn Ihr anstelle eines DataSets mit seinen Standardabläufen das EF zum Laden der Daten nutzt, dann könnt Ihr mit einem XmlSerializer das Problem lösen, indem die Datenklassen entsprechend gestaltet werden. Dazu mal eine Demo:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Text;
    using System.Xml;
    using System.Xml.Serialization;
    
    namespace ConsoleApp1
    {
      public class Program48
      {
        static void Main(string[] args)
        {
          try
          {
            Demo c = new Demo();
            c.Execute();
          }
          catch (Exception ex) { Console.WriteLine(ex.ToString()); }
          Console.WriteLine("Fertig, Abschluss mit beliebiger Taste");
          Console.ReadKey();
        }
    
        class Demo
        {
          internal void Execute()
          {
            List<Data> liste = new List<Data>();
            for (int i = 1; i < 10; i++) liste.Add(new Data() { ID = i });
            XmlSerializer ser = new XmlSerializer(typeof(List<Data>));
            using (MemoryStream ms = new MemoryStream())
            {
              ser.Serialize(ms, liste);
              Console.WriteLine(Encoding.Default.GetString(ms.ToArray()));
            }
          }
        }
        public class Data
        {
          public int ID { get; set; }
    
          private string _data;
          [XmlElement(IsNullable = true)]
          public string Info
          {
            get { return string.IsNullOrEmpty(this._data) ? string.Empty : this._data; }
            set { if (this._data != value) this._data = value; }
          }
        }
      }
    }
    


    --
    Viele Grüsse
    Peter Fleischer (ehem. MVP für Developer Technologies)
    Meine Homepage mit Tipps und Tricks

    • Als Antwort markiert uwe domschke Mittwoch, 17. Oktober 2018 15:38
    Mittwoch, 17. Oktober 2018 14:46
  • Hallo Peter,
    danke, werde ich ausprobieren.

    Mittelung vom Forum

    Mittwoch, 17. Oktober 2018 15:38