Почему XmlWriter в C# меняет \n на \r\n внутри текстового элемента?C#

Место общения программистов C#
Ответить
Anonymous
 Почему XmlWriter в C# меняет \n на \r\n внутри текстового элемента?

Сообщение Anonymous »

Вот минимальный пример C#:

Код: Выделить всё

var settings = new XmlWriterSettings()
{
OmitXmlDeclaration = true,
};

var stringWriter = new StringWriter();
stringWriter.NewLine = "\n";

using var writer = XmlWriter.Create(stringWriter, settings);

writer.WriteStartElement(null, "Nm", null);
writer.WriteString("te\nxt");
writer.WriteEndElement();
writer.Flush();

var test = stringWriter.ToString();
Console.WriteLine(test.Contains("te\r\nxt")); // Outputs true on my Windows machine
Почему этот код выдает true? Я сказал StringWriter использовать символы новой строки \n, хотя не думаю, что это уместно. Я заблудился в исходном коде .net, но похоже, что XmlWriter делегирует содержимое строкового элемента производному типу, который реализован с помощью StringBuilder в моем StringWriter, который нигде не ссылается на свойство NewLine, которое я вижу. Однако я не эксперт.
Это на самом деле XML c15n или что-то в этом роде?
Я запустил эту тестовую программу на .net 10, и она по-прежнему возвращает true, хотя на самом деле меня волнуют результаты в net471.

Справочная информация
Я работаю над системой, которая обрабатывает XML-документы ISO20022 полученные из сети SWIFT. SWIFT выполняет проверку схемы XML с помощью XSD, и документ XML должен быть действительным, чтобы достичь нашей инфраструктуры.
Мы обрабатываем эти документы (теоретически без преобразования) с помощью нескольких приложений SWIFT, подключенных через IBM MQ, а затем вставляем их в консольное приложение C#, работающее в Windows, которым владеет моя команда. Наше приложение читает данные из IBM MQ. В одном случае наше консольное приложение C# проверило документ, используя тот же XSD, который использует SWIFT, и объявило его недействительным. Мне нужно определить, где возникла проблема.
Представьте определение элемента XSD следующим образом: и значение элемента $"A{[.. Enumerable.Repeat('\n', 33)]}B". То есть: A, 33 символа новой строки, B. Глупый, но действительный элемент, верно? Если \n не заменяется на \r\n, это слишком долго. Это ошибка проверки схемы, которую выдает наше приложение.
Может быть, есть какая-то другая, более тонкая причина, по которой это происходит, но на данный момент это мое лучшее предположение. Просто пытаюсь сузить область возникновения проблемы, и теперь мне интересно, как здесь ведет себя XmlWriter.

Подробнее здесь: https://stackoverflow.com/questions/798 ... xt-element
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»