XML сохранить возврат каретки (CR) при загрузке XDocument - PullRequest
2 голосов
/ 13 февраля 2020

У меня есть следующий XML файл, который содержит символы возврата каретки (CR):

enter image description here

После загрузки XDocument,

XDocument xDocument = XDocument.Load(fileName, LoadOptions.PreserveWhitespace);

(CR) символы преобразуются в возврат каретки, символы перевода строки (CR) (LF):

enter image description here

Есть ли способ предотвратить преобразование этих символов?

Ответы [ 3 ]

2 голосов
/ 13 февраля 2020

В спецификации XML говорится, что \n, \r и \r\n рассматриваются как эквивалентные и все нормализуются до \n синтаксическим анализатором XML. Если вам нужен CR (\r) в вашем контенте, который не будет обработан синтаксическим анализатором XML таким образом, вы должны записать его как 
.

0 голосов
/ 21 февраля 2020

Попробуйте прочитать файл с помощью StreamReader, отправить его в XmlTextReader и загрузить его в XDocument. Это должно (надеюсь) сохранить ваши возвраты каретки.

StreamReader reader = new StreamReader(fileName);
XmlTextReader xmlReader = new XmlTextReader(reader);
XDocument xDocument = XDocument.Load(xmlReader);
0 голосов
/ 16 февраля 2020

Как сказал Майкл Кей, \r, \n и \r\n рассматриваются как эквивалентные.

Поэтому, если вам нужно иметь отдельный символ \r в xml, то Вы должны записать его как 
 сущность.

Давайте создадим тест xml с необходимым нам содержанием.

string s = "<root><a/>&#x0D;\r\n<b/>&#x0D;<c/>\r\n</root>";

File.WriteAllText("test.xml", s, Encoding.UTF8);

Теперь давайте прочитаем его с сохранением пробельных символов и посмотрим, что они преобразуются в.

var doc = XDocument.Load("test.xml", LoadOptions.PreserveWhitespace);

foreach (var node in doc.DescendantNodes())
{
    if (node is XElement elem)
    {
        Console.WriteLine("Element: " + elem.Name);
    }
    if (node is XText text)
    {
        Console.WriteLine("Text: " + 
            string.Join(", ", text.Value.Select(c => ((int)c).ToString("X"))));
    }
}

Результат будет следующим.

Element: root
Element: a
Text: D, A
Element: b
Text: D
Element: c
Text: A

Как видите, пробельные символы хранятся в XText узлах.

Сущность &#x0D; представляется как \r (D символ в шестнадцатеричном представлении).

Новая строка \r\n представляется как один символ \n (A в шестнадцатеричном представлении) ).

Таким образом, вы можете анализировать содержимое узлов XText и вручную определять их содержимое.

...