Benutzer mit den meisten Antworten
XML Deserialisieren

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&J Reflex SI Abdeckung 4fach</Bezeichnung1> <Bezeichnung2>alpinweis 2514-214</Bezeichnung2> <MengenEinheit></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&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 '' 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
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- Als Antwort vorgeschlagen Martin Honnen Sonntag, 8. Januar 2012 11:28
- Als Antwort markiert Christian Tauschek Sonntag, 8. Januar 2012 11:58
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- Als Antwort vorgeschlagen Martin Honnen Sonntag, 8. Januar 2012 11:28
- Als Antwort markiert Christian Tauschek Sonntag, 8. Januar 2012 11:58
-
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
- Bearbeitet Christian Tauschek Sonntag, 8. Januar 2012 12:21