2016-09-29 4 views
1

У меня есть случай, когда я хотел бы генерировать XML до размещения его в API, содержащие разрывы строк (\ п), но не возврат каретки (без \ г).XDocument добавляет возврат каретки при формировании окончательного XML строки

В C#, хотя, кажется, что XDocument автоматически добавляет возврат каретки в ее в строку метода:

var inputXmlString = "<root>Some text without carriage return\nthis is the new line</root>"; 

// inputXmlString: <root>Some text without carriage return\nthis is the new line</root> 

var doc = XDocument.Parse(inputXmlString); 

var xmlString = doc.Root.ToString(); 

// xmlString: <root>Some text without carriage return\n\rthis is the new line</root> 

В doc.Root.ToString(), наборы \ N \ г добавляются между элементами для отступы, которые не имеют значения для интерпретации получателя xml-сообщения в целом. Однако метод ToString() также добавляет \ r внутри фактического текстового поля, где мне нужно сохранить автономные разрывы строк (\ n без \ r после него).

Я знаю, что могу сделать окончательную строку заменой, удалив все возвраты каретки из окончательной строки до фактического HTTP-сообщения, которое должно быть выполнено, но это просто кажется неправильным.

Проблема такая же при построении xml-документа с использованием объектов XElement вместо Document.Parse. Проблема также сохраняется, даже если я использую элемент CData для обертывания текста.

Может ли кто-нибудь объяснить мне, если я что-то не так или если есть какой-то чистый способ добиться того, что я пытаюсь сделать?

ответ

3

XNode.ToString является удобство, которое использует XmlWriter под одеялом - вы можете увидеть код в reference source.

Per the documentation для XmlWriterSettings.NewLineHandling:

Заменить параметр сообщает XmlWriter, чтобы заменить символы новой строки с \ г \ п, что новый формат строки, используемый в операционной системе Microsoft Windows. Это помогает убедиться, что файл может быть правильно отображен приложениями «Блокнот» или «Microsoft Word». Этот параметр также заменяет новые строки в атрибутах с символьными сущностями для сохранения символов. Это значение по умолчанию.

Так вот почему вы видите это, когда вы преобразовываете свой элемент обратно в строку. Если вы хотите изменить это поведение, вы должны создать свой собственный XmlWriter с вашим собственным XmlWriterSettings:

var settings = new XmlWriterSettings 
{ 
    OmitXmlDeclaration = true,   
    NewLineHandling = NewLineHandling.None 
}; 

string xmlString; 

using (var sw = new StringWriter()) 
{ 
    using (var xw = XmlWriter.Create(sw, settings)) 
    { 
     doc.Root.WriteTo(xw);      
    } 
    xmlString = sw.ToString(); 
} 
+0

Спасибо! Это сделал трюк. –

1

Вы пробовали:

how to remove carriage returns, newlines, spaces from a string

string result = XElement.Parse(input).ToString(SaveOptions.DisableFormatting); 
Console.WriteLine(result); 
+0

не делает разницы –

+0

Это фиксированная моя проблема, как делать xdoc.Root.Value сохранил все форматирование но выполнение xdoc.Root? .ToString() удаляло возврат каретки. Спасибо! – Frederic

Смежные вопросы