Сохранение специальных символов в 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!";
 }