XMLSerializer und \r\n

Hallo Community,

in einem meiner Programm setze ich eine Klasse zum erstellen von XML-Dateien ein.
Dabei wird über den XMLSerializer die nachfolgende Struktur serialisiert:

[Serializable]
public struct Dataset 
{
&nbsp;&nbsp;&nbsp; public Dataset(string Name, string Description, List\<string\> Values)
&nbsp;&nbsp;&nbsp; {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Name = Name;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Description = Description;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this.Values = Values;
&nbsp;&nbsp;&nbsp; }
&nbsp;&nbsp;&nbsp; [XmlAttribute] public string Name;
&nbsp;&nbsp;&nbsp; [XmlAttribute] public string Description;
&nbsp;&nbsp;&nbsp; public List\<string\> Values;
}

An und für sich ist das Ergebnis wie gewollt:

\<?xml version="1.0"?\>
\<SettingsCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"\>
&nbsp; \<Datasets\>
&nbsp;&nbsp;&nbsp; \<Dataset Name="Name 1" Description="Description 1"\>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<Values\>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<string\>Value 1.1\</string\>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<string\>Value 1.2\</string\>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \</Values\>
&nbsp;&nbsp;&nbsp; \</Dataset\>
&nbsp; \</Datasets\>
\</SettingsCollection\>

Ein Problem hat sich aber dadurch ergeben, dass in einer Anforderung an das Programm
auch Zeilenumbrüche \r\n mit aufgenommen werden müssen.

Diese Zeilenumbrüche werden im Feld Description als &#xA ; angezeigt wodurch der ursprüngliche Zeilenumbruch \r\n erhalten bleibt.
Nur bei den Werten (Values) passiert dies nicht. Dort wird aus dem Zeilenumbruch \r\n ein \n in der XML-Datei und wird in Notepad auch direkt als Zeilenumbruch dargestellt:

\<?xml version="1.0"?\>
\<SettingsCollection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"\>
&nbsp; \<Datasets\>
&nbsp;&nbsp;&nbsp; \<Dataset Name="Name 1" Description="Description 1&#xD;&#xA;Test"\>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<Values\>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<string\>Value 1.1
Test\</string\>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \<string\>Value 1.2\</string\>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \</Values\>
&nbsp;&nbsp;&nbsp; \</Dataset\>
&nbsp; \</Datasets\>
\</SettingsCollection\>

Wenn ich nun diese XML-Datei wieder deserialisiere, wird das Feld Description richtig dargestellt, wohingegen der Wert mit „Value1.1Test“ zurückgegeben wird.

Wie kann ich die Struktur so abändern das auch die einzelnen Werte (Values) korrekt mit Zeilenumbrüchen abgespeichert werden??

Das Ergebnis soll <string>Value 1.1 Test</string> sein…

Ich hoffe jemand hat eine Lösung…

Vielen Dank…

MfG GuerillaDenker

Hi,

probiers mal mit der folgenden Deklaration:

 [XmlArray]
 [XmlArrayItem(ElementName="string")]
 public List Values { get; set; }

Anstatt nur

public List Values;

Cheers,
Herb

Hallo,

Du musst den XmlWriter davon abhalten, das CR (\r) zu entfernen. Dies machst du mittels XmlWriterSettings:

 XmlWriterSettings settings = new XmlWriterSettings
 {
 NewLineHandling = NewLineHandling.Entitize
 };
 using (XmlWriter writer = XmlWriter.Create("test.xml", settings))
 {
 XmlSerializer serializer = new XmlSerializer(typeof(Dataset));
 serializer.Serialize(writer, ds);
 }

Der Grund für das Entfernen des CRLF ist also nicht die Datenstruktur oder fehlende Attribute für die Serialisierung, sondern das Verhalten des XML Writers, das übrigens konform der XML-Spezifikation ist.

Gruß
maria

Hallo Maria,

danke für deine Antwort.
Ich werde den Serializer etwas umschreiben und deinen Vorschlag mal probieren.
Du sagst an der Struktur muss ich nichts ändern??..

MfG,
GuerillaDenker

Hallo Herb,

so ähnlich hatte ich es schon Erfolglos getestet.
Allerdings nicht mit ElementName. Ich habe an der Stelle den Typ string noch einmal festgelegt aber das hatte nichts geholfen…
Aber ich werde das auch mal ohne Typ testen…

Vielen Dank für deine Antwort…

MfG,
GuerillaDenker

Hi,

an der Struktur muss nichts geändert werden.

Gruß
maria