2009-07-12 13 views
8

Mam klasę z właściwością oznaczoną [XmlText], która akceptuje wejście wielowierszowe. W moim pliku XML potwierdziłem, że zakończenia linii wewnątrz treści tekstowej są w rzeczywistości zgodne z "\r\n", podobnie jak reszta pliku.Formatowanie XML "standaryzujące" zakończenia linii, jak to zatrzymać? (.NET)

Kod używam do deserializowania jest:

XmlSerializer configSerializer = new XmlSerializer(typeof(WorldList)); 
string file = "test.xml"; 

if (File.Exists(file)) 
{ 
    using (TextReader r = new StreamReader(file)) 
    { 
     foo = configSerializer.Deserialize(r); 
    } 
} 

Ale wewnątrz seter dla właściwości [XmlText], value już "\n" jako linię kończącym. Głównym powodem tego jest denerwujące, ponieważ zakończenia linii "\n" nie wyświetlają się poprawnie w TextBox ... Nie jestem do końca pewien, która część powoduje problemy, ale myślałem, że ktoś tutaj może rzucić trochę światła na tę sytuację .

Odpowiedz

10

mam zmienić kod przykładowy, aby ułatwić szybko umieścić kod w środowisku C# rozwoju. Rozmyślnie nie uwzględniam też instrukcji - to tylko przykładowy kod.

Dla przykładu mamy klasę obserwacji chcemy serializacji:

public class DataToSerialize 
    { 
     public string Name { get; set; } 
    } 

Jeśli spróbujemy serializacji i deserializacji to w sposób opisać linię gdzie „same” zostanie wydrukowany nie zostanie wykonana (Zakładam, że kod będzie działał na Windows z Environment.NewLine, zastąpić „\ r \ n”, jeśli nie są):

DataToSerialize test = new DataToSerialize(); 
    test.Name = "TestData" + Environment.NewLine; 
    XmlSerializer configSerializer = new XmlSerializer(typeof(DataToSerialize)); 
    MemoryStream ms = new MemoryStream(); 
    StreamWriter sw = new StreamWriter(ms); 
    configSerializer.Serialize(sw, test); 
    ms.Position = 0; 
    DataToSerialize deserialized = (DataToSerialize)configSerializer.Deserialize(ms); 
    if (deserialized.Name.Equals("TestData" + Environment.NewLine)) 
    { 
     Console.WriteLine("Same"); 
    } 

jednak to może być stałe, przez ręczne przypisanie do XmlTextReader serializer, z jego właściwością Normalization ustawioną na false (jedyne użycie d domyślnie w serializatora jest ustawiona na wartość true):

DataToSerialize test = new DataToSerialize(); 
    test.Name = "TestData" + Environment.NewLine; 
    XmlSerializer configSerializer = new XmlSerializer(typeof(DataToSerialize)); 
    MemoryStream ms = new MemoryStream(); 
    StreamWriter sw = new StreamWriter(ms); 

    configSerializer.Serialize(sw, test); 
    ms.Position = 0; 
    XmlTextReader reader = new XmlTextReader(ms); 
    reader.Normalization = false; 
    DataToSerialize deserialized = (DataToSerialize)configSerializer.Deserialize(reader); 
    if (deserialized.Name.Equals("TestData" + Environment.NewLine)) 
    { 
     Console.WriteLine("Same"); 
    } 

samo będzie teraz drukowania, który chyba się mylę jest zachowanie wymagać?

+1

Podoba mi się ;-p –

+2

Niestety, brak użycia instrukcji w przykładowym kodzie sprawia, że ​​trudniej jest odczytać w mojej opinii ... nic złego w użyciu. –

+0

@ Matthew - Sądzę, że to jedna z tych subiektywnych rzeczy - udowodnić, że jedna jest lepsza od drugiej, którą naprawdę trzeba przeprowadzić kontrolowany eksperyment. Z moją odpowiedzią jest to trochę dziwne, ponieważ MemoryStream musi być objęty zakresem zarówno serializacji, jak i deserializacji, która w realnym świecie by się nie wydarzyła. W przypadku twojego pytania o używanie wyciągów jest przydatne (moim zdaniem). Kiedy pisałem kod, w rzeczywistości zawierałem instrukcje użycia, ale wyrzuciłem je, gdy zamieszczałem odpowiedź (mój mózg jest podłączony, aby zapobiec narzekaniu przez FXCop). – RichardOD

4

Gdybyś szeregowania, następnie XmlWriterSettings.NewLineHandling (Replace) byłoby warto spróbować - ale to nie pomoże czytanie. Trochę grungy, ale może to zrobić bezpośrednio w seter:

private string text; 
[XmlText] 
public string Text { 
    get { return text; } 
    set 
    { 
     Regex r = new Regex("(?<!\r)\n"); 
     text = r.Replace(value, "\r\n"); 
    } 
} 
+0

Tak, myślałem, że zastąpienie regex może być jedynym rozwiązaniem, ale miałem nadzieję, że był jakiś "lepszy sposób" [tm] –

+0

Jest jeszcze inny sposób, nie powiedziałbym, że było lepiej - opublikuję odpowiedz krótko. – RichardOD

+0

Regex jest dobrym przykładem na znalezienie, kiedy używane jest \ n zamiast \ r \ n. – RichardOD

Powiązane problemy