Natknąłem się dziś na dość irytującą cechę klasy XCData, reprezentującej element CDATA w dokumencie XML. Otóż jeśli w poniższym kodzie
string xml = "<node><![CDATA[line1\r\nline2]]></node>";
XDocument doc = XDocument.Parse(xml);
XCData data = doc.Element("node").FirstNode as XCData;
string value = data.Value;
przeanalizujemy wartość zmiennej value, to okaże się, że nie zawiera ona, jak możnaby oczekiwać, łańcucha znaków line1\r\nline2 a line1\nline2. Okazuje się, że takie zachowanie jest jak najbardziej zgodne ze standardem XML, co można znaleźć tutaj.
Są dwie możliwości obejścia tego problemu. Można wymusić, by znaki \r nie zostały usuwane z całego dokumentu poprzez użycie XmlTextReadera:
string xml = "<node><![CDATA[line1\r\nline2]]></node>";
XDocument doc = XDocument.Parse(new XmlTextReader(new StringReader(xml)));
bądź skorzystanie z informacji zawartej w specyfikacji. Specyfikacja gwarantuje, że w zmiennej value nie znajdzie się znak \r, można więc zamienić wszystkie wystąpienia \n na \r\n.
Co ciekawe problem ten nie występuje w standardowych klasach do obsługi dokumentów XML (XmlDocument / XmlCDataSection).