Сохранение специальных символов в xml
У меня есть строка xml, хранящаяся в таблице db с символами подачи строки. В моей программе C# 3.5 я загружаю и управляю ею с помощью Linq to xml, а затем показываю ее как строку в элементе управления textbox в форме пользовательского интерфейса.
Мне нужно отступить этот xml, а также сохранить возврат строки/каретки, показывая его в пользовательском интерфейсе.
могу отступить, но как сохранить символы LF/CR в xml??
вот пример кода C#:
XElement rootNode = CreateRootNode();
XElement testXmlNode = XElement.Parse(xmlFromDbWithLFChars);
rootNode.Add(testXmlNode );
var builder = new StringBuilder();
var settings = new XmlWriterSettings()
{
Indent = true
};
using (var writer = XmlWriter.Create(builder, settings))
{
rootNode.WriteTo(writer);
}
xmlString = builder.ToString();
xmlString = xmlString.Replace("
", Environment.NewLine); //Doesnt work
xmlString = xmlString.Replace("
", Environment.NewLine); //Doesnt work
//Heres how the xml should look like in the UI control:
<TestNode
name="xyz"
Id="12">
<Children>
<Child name="abc" location="p" />
</Children>
</TestNode>
5 ответов
что вы хотите сделать, это установить настройки форматирования на XmlWriter, поэтому измените свою строку:
var settings = new XmlWriterSettings()
{
Indent = true
};
что-то вроде этого:
var settings = new XmlWriterSettings()
{
Indent = true,
IndentChars = "\n",
NewLineOnAttributes = true
};
спасибо всем за ваши ответы. Наконец - то у меня получилось.
мой подход не использует синтаксический анализатор Linq2Xml/SAX.Я генерирую xml с помощью StringBuilder и показываю его в пользовательском интерфейсе в элементе управления WinForms Rich textbox.Теперь я могу видеть линейные каналы, как это в пользовательском интерфейсе.
каждый раз, когда вы конвертируете XML-документ в строку и начинаете манипулировать строкой, вы должны думать про себя: "я делаю что-то неправильно.- По твоему описанию я не уверен, что это правда, но готов поспорить, что так оно и есть.
если пробелы в XML, который вы вытаскиваете из базы данных, значительны, вы хотите сохранить его при разборе в свой XElement
. Для этого используйте перегрузку XElement.Parse
вот это, например:
XElement testXmlNode = XElement.Parse(xmlFromDbWithLFChars, LoadOptions.PreserveWhitespace);
когда вы делаете это, синтаксический анализатор оставит пробелы в проанализированном XElement
текстовые узлы документа точно там, где они были в исходной строке. XmlWriter
не связывается с существующими пробелами в текстовых узлах (хотя он добавит новые пробелы, если вы скажете ему отступ), поэтому это должно дать вам то, что вы хотите.
вы можете использовать XmlReader для сохранения новых строк и всего остального.. вот пример кода, который отлично работал для меня при тестировании:
System.Xml.XmlReader reader = System.Xml.XmlReader.Create("XML URI here");
System.Text.StringBuilder sb = new System.Text.StringBuilder();
while (reader.Read())
{
sb.Append(reader.ReadOuterXml());
}
reader.Close();
txtXML.InnerText = sb.ToString();
txtXML.Visible = true;
в моем тесте я загрузил XML-файл, вы можете загрузить управляемую строку XML.
вы пытались убедиться, что текстовое поле находится в многострочном режиме и принимает возврат каретки?
public void CreateMyMultilineTextBox() {
// Create an instance of a TextBox control.
TextBox textBox1 = new TextBox();
// Set the Multiline property to true.
textBox1.Multiline = true;
// Add vertical scroll bars to the TextBox control.
textBox1.ScrollBars = ScrollBars.Vertical;
// Allow the RETURN key to be entered in the TextBox control.
textBox1.AcceptsReturn = true;
// Allow the TAB key to be entered in the TextBox control.
textBox1.AcceptsTab = true;
// Set WordWrap to true to allow text to wrap to the next line.
textBox1.WordWrap = true;
// Set the default text of the control.
textBox1.Text = "Welcome!";
}