none
XML Deserialisieren RRS feed

  • Frage

  • Hallo Leute,
    beim XML-Deserialisieren tritt bei mir folgender Fehler auf: There is an Error in XML-Document (6,23)

    Grundsätzlich funktioniert das Ganze mit tausenden von Artikeln einwandfrei, nur wenn die zu deserialisierende Klasse einen bestimmten Artikel enthält tritt der Fehler auf:

    XML-der fehlerhaften Klasse:
    <?xml version="1.0" encoding="utf-16"?>
    <cSendNCCArtikel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Artikel>
        <Bezeichnung1>B&amp;J Reflex SI Abdeckung 4fach</Bezeichnung1>
        <Bezeichnung2>alpinweis 2514-214</Bezeichnung2>
        <MengenEinheit>&#x1;</MengenEinheit>
        <Hauptkatalog>TAU</Hauptkatalog>
        <Katalog>TAU</Katalog>
        <Matchcode>BJRESIABD4</Matchcode>
        <VKN>7.25</VKN>
        <Mehrwertsteuersatz>20</Mehrwertsteuersatz>
        <EP>5.18</EP>
        <EPAufschlag>40</EPAufschlag>
        <PreisEinheit>1</PreisEinheit>
        <Nachbestellen>false</Nachbestellen>
      </Artikel>
    </cSendNCCArtikel>
    

    XML einer funktionierenden Klasse:
    <?xml version="1.0" encoding="utf-16"?>
    <cSendNCCArtikel xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <Artikel>
        <Bezeichnung1>B&amp;J Refelx SI Abdeckung 3 fach</Bezeichnung1>
        <Bezeichnung2>alpinweiß 2513-214</Bezeichnung2>
        <MengenEinheit>Stk</MengenEinheit>
        <Hauptkatalog>TAU</Hauptkatalog>
        <Katalog>TAU</Katalog>
        <Matchcode>BJRESIABD3</Matchcode>
        <VKN>4.18</VKN>
        <Mehrwertsteuersatz>20</Mehrwertsteuersatz>
        <EP>2.99</EP>
        <EPAufschlag>40</EPAufschlag>
        <PreisEinheit>1</PreisEinheit>
        <Nachbestellen>false</Nachbestellen>
      </Artikel>
    </cSendNCCArtikel>
    

    Sofort fällt natürlich der Eintrag '&#x1;' in der Mengeneinheit auf. Dort ist auch die Fehlerursache. Problem dabei ist, dass in der (Fremd-) Datenbank
    in der Mengeneinheit ein Sonderzeichen vorhanden ist.
    Wie kann ich es nun anstellen, dass auch das Serialisieren und Deserialisieren mit derartigen Sonderzeichen klappt.

    Vielen Dank im Voraus
    Christian Tauschek




    Christian Tauschek
    Sonntag, 8. Januar 2012 10:57

Antworten

  • Wie genau sieht denn der VB-Code aus, der die Serialisierung und Deserialisierung durchführt?

    Je nach XmlWriterSettings bzw. XmlReaderSettings sollte schon beim Serialisieren des Objektes eine Fehlermeldung kommen. Wenn du wirklich den Wert mit dem Steuerzeichen schreiben und lesen willst (XML 1.0 ist das dann nicht mehr, der Datenaustausch mit anderen Plattformen, die XML 1.0 erwarten, wird mit solchen Daten nicht funktionieren), dann mit entsprechenden XmlWriter/ReaderSettings:

    Imports System.Xml
    Imports System.Xml.Serialization
    
    
    Module Module1
    
        Sub Main()
            Dim xws As New XmlWriterSettings()
            xws.CheckCharacters = False
    
            Dim ser As New XmlSerializer(GetType(Foo))
    
            Dim foo1 As New Foo() With {.Bar = ChrW(1)}
    
            Using xw As XmlWriter = XmlWriter.Create("test.xml", xws)
                ser.Serialize(xw, foo1)
            End Using
    
            Dim foo2 As Foo
    
            Dim xrs As New XmlReaderSettings()
            xrs.CheckCharacters = False
    
            Using xr As XmlReader = XmlReader.Create("test.xml", xrs)
                foo2 = CType(ser.Deserialize(xr), Foo)
            End Using
    
            Console.WriteLine("Input = Output: {0}", foo1.Bar = foo2.Bar)
    
    
        End Sub
    
    End Module
    
    Public Class Foo
        Public Property Bar As String
    End Class
    


     

     

     


    MVP Data Platform Development My blog
    Sonntag, 8. Januar 2012 11:12

Alle Antworten

  • Wie genau sieht denn der VB-Code aus, der die Serialisierung und Deserialisierung durchführt?

    Je nach XmlWriterSettings bzw. XmlReaderSettings sollte schon beim Serialisieren des Objektes eine Fehlermeldung kommen. Wenn du wirklich den Wert mit dem Steuerzeichen schreiben und lesen willst (XML 1.0 ist das dann nicht mehr, der Datenaustausch mit anderen Plattformen, die XML 1.0 erwarten, wird mit solchen Daten nicht funktionieren), dann mit entsprechenden XmlWriter/ReaderSettings:

    Imports System.Xml
    Imports System.Xml.Serialization
    
    
    Module Module1
    
        Sub Main()
            Dim xws As New XmlWriterSettings()
            xws.CheckCharacters = False
    
            Dim ser As New XmlSerializer(GetType(Foo))
    
            Dim foo1 As New Foo() With {.Bar = ChrW(1)}
    
            Using xw As XmlWriter = XmlWriter.Create("test.xml", xws)
                ser.Serialize(xw, foo1)
            End Using
    
            Dim foo2 As Foo
    
            Dim xrs As New XmlReaderSettings()
            xrs.CheckCharacters = False
    
            Using xr As XmlReader = XmlReader.Create("test.xml", xrs)
                foo2 = CType(ser.Deserialize(xr), Foo)
            End Using
    
            Console.WriteLine("Input = Output: {0}", foo1.Bar = foo2.Bar)
    
    
        End Sub
    
    End Module
    
    Public Class Foo
        Public Property Bar As String
    End Class
    


     

     

     


    MVP Data Platform Development My blog
    Sonntag, 8. Januar 2012 11:12
  • Hallo Martin,
    danke für deine Antwort.
    Das ist mein Code:

        'serialisiert ein Objekt in einen XML-String
        Public Function SerializeToXML(ByVal o As Object) As String
            Dim objStreamWriter As New StringWriter
            Dim x As New XmlSerializer(o.GetType)
            x.Serialize(objStreamWriter, o)
            objStreamWriter.Close()
            Return objStreamWriter.ToString
        End Function
    
        'deserialisiert ein Objekt aus einem XML-String
        Public Function DeserializeFromXML(ByVal ObjektType As System.Type, ByVal XML As String) As Object
            Dim x As New XmlSerializer(ObjektType)
            Dim objStreamReader As New StringReader(XML)
            Return x.Deserialize(objStreamReader)
            objStreamReader.Close()
        End Function
    

    mfg
    Christian Tauschek

     

     


    Christian Tauschek

    Sonntag, 8. Januar 2012 11:57