Короткая версия
Вам необходимо добавить атрибут xml:space
.LoadOptions.PreserveWhitespace
влияет только на синтаксический анализ строки.Это не добавляет атрибут.Вы должны добавить:
serv.SetAttributeValue(XNamespace.Xml + "space", "preserve");
Длинная версия
SQL Server поддерживает атрибут xml:space
.Этот запрос:
create table #xmltest (field xml);
insert into #xmltest
values
('<elem> </elem>'),
('<elem xml:space="preserve"> </elem>');
select * from #xmltest;
Возвращает:
<elem />
<elem xml:space="preserve"> </elem>
Код вопроса, тем не менее, не определяет это. анализирует строку в XElement с PreserveWhitespace
, но не добавляет этот атрибут.Если исходная строка не содержит этого атрибута, XElement также не будет его содержать.
Код вставляет эквивалент первого значения, которое не требует сохранения пробела.
Дляпример:
XElement.Parse("<elem> </elem>",LoadOptions.PreserveWhitespace).ToString();
Создает <elem> </elem>
, который не указывает, что пробел должен быть сохранен.PreserveWhitespace
в этом случае переопределяет поведение по умолчанию, которое заключается в игнорировании пробела.
Без PreserveWhitespace
Parse игнорирует пробелы и возвращает <elem></elem>
.
С другой стороны:
XElement.Parse("<elem xml:space='preserve'> </elem>").ToString()
Производит <elem xml:space="preserve"> </elem>
.Нет необходимости использовать флаг PreserveWhitespace
, сам XElement распознает и учитывает этот флаг.
Если исходная XML-строка содержит пробелы, но не содержит атрибут xml:space
, онанеобходимо добавить, чтобы другие классы и приложения, такие как SQL Server, знали, что они должны сохранять пробелы.Следующий код:
var serv=XElement.Parse("<elem> </elem>",LoadOptions.PreserveWhitespace);
serv.SetAttributeValue(XNamespace.Xml + "space", "preserve");
serv.ToString();
Вернет <elem xml:space="preserve"> </elem>
, который будет распознан SQL Server.
Объединение всего этого вместе
Этот LINQв код SQL:
var serv=XElement.Parse("<elem> </elem>",LoadOptions.PreserveWhitespace);
serv.SetAttributeValue(XNamespace.Xml + "space", "preserve");
Xmltests.InsertOnSubmit(new Xmltest{Field=serv});
Вставит:
<elem xml:space="preserve"> </elem>
В базу данных