Problem ze znakiem \r\n

0

Witam

Mam taki problem, że wczytuję sobie konfigurację z xml'a. W pewnym miejscu jako wartość mam znak '\r\n'. Zapisuję te wartości w pamięci, a w dalszej części programu korzystam z nich w taki sposób, że operując na stringu poszukuję indexu znaku czyli np:

int index = string.IndexOf(znak);

Nic nadzwyczajnego, ale problem jest w tym, że kiedy chodzi o znak właśnie '\r\n' to jest on źle wczytywany z xml'a: '\r\n'. Przez to nie potrafię znaleźć indeksu entera. Proszę o pomoc :(

Pozdrawiam

0

Tak na marginesie: "\r\n" to dwa znaki.

0

masz rację, to dwa znaki, ale sens pozostał ten sam :)

0

Nie potrafisz znaleźć ciągu "\r\n" ?

0
adf88 napisał(a)

Nie potrafisz znaleźć ciągu "\r\n" ?

Wykonaj analogiczne działanie i będziesz wiedział czy sam potrafisz! Wczytaj z xml'a znaki '\r\n' i zobacz w jaki sposób są one przechowywane. Zauważysz, że żeby odróżnić ciąg znaków '\r\n' od znaku specjalnego '\r\n' (enter), przed każdy '' jest dokładany drugi '' żeby było wiadomo, że to jest ciąg znaków a nie znak specjalny. W takiej sytuacji jeżeli wczytujesz z xml'a '\r\n' i zamieniany jest on na '\r\n' a Ty potrzebujesz wyszukać znaku specjalnego czyli '\r\n' i sprawdzenie jest nieprawidłowe, a algorytm się sypie to już nie jest tak fajnie!

0
<?xml version="1.0" encoding="utf-8"?>
<Test>
	<napis>foo\r\nbar</napis>
	<napis>foobar\r\nfoobar</napis>
</Test>
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create("E:\\test.xml");

            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element:
                        if (reader.Name == "napis")
                        {
                            reader.Read();
                            Console.WriteLine(reader.Value);
                            Console.WriteLine(reader.Value.IndexOf("\\r\\n"));
                        }
                        break;
                }
            }

            reader.Close();

            Console.ReadKey();
        }
//output

foo\r\nbar
3
foobar\r\nfoobar
6

O to chodzi? Szczerze to sie troche pogubilem juz w tym co chcesz wykonac.

0

Jeżeli się pogubiłeś to rozjaśnię na Twoim przykładzie bo pewnie trochę namieszałem, a tak będzie łatwiej.
Chodzi o to, żeby po wyświetleniu efekt był taki:
foo
bar

a nie taki:
foo\r\nbar

Chodzi o to, żeby widoczny w xml'u '\r\n' był traktowany jako znak specjalny a nie jako ciąg znaków. Oczywiście chciałbym, żeby jakikolwiek znak specjalny był traktowany jako znak specjalny, a nie jako ciąg znaków, bo w xml'u może też wystąpić np. '\r', '\n' i inne. Czyli żebym nie musiał szukać konkretnie 'reader.Value.IndexOf("\r\n")' tylko żeby to działało z automatu.

0
Console.WriteLine(reader.Value.Replace("\\r\\n", "\n"));

ew.

StringReader linesReader = new StringReader(reader.Value.Replace("\\r\\n", "\n"));
string line;
for (int i = 1; null != (line = linesReader.ReadLine()); i++)
{
    Console.WriteLine("Linia nr {0}: {1}", i, line);
}
0

Troche offtopic.. nie lepiej zrobic serializacje/deserializacje klasy zamiast bawic sie w reczny odczyt i zapis elementow drzewa xml?
Do przechowywania konfiguracji jest App.config i metody z System.Configuration - tu nawet serializacja bawic sie nie trzeba bo wszystko jest gotowe.

1 użytkowników online, w tym zalogowanych: 0, gości: 1