Сохранение специальных символов в xml - PullRequest
6 голосов
/ 12 ноября 2010

В таблице БД хранится строка XML с символами перевода строки.В моей программе на 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 ]

3 голосов
/ 16 ноября 2010

Что вы хотите сделать, это установить параметры форматирования на XmlWriter, поэтому измените строку:

var settings = new XmlWriterSettings() 
    { 
     Indent = true 
    }; 

на что-то вроде этого:

var settings = new XmlWriterSettings() 
    { 
     Indent = true,
     IndentChars = "\n",
     NewLineOnAttributes = true
    }; 
1 голос
/ 17 ноября 2010

Спасибо всем за ваши ответы.Наконец, я мог бы заставить это работать.

Мой подход не использует анализатор Linq2Xml / SAX. Я генерирую xml с помощью StringBuilder и показываю его в пользовательском интерфейсе в элементе управления Rich Text Box winforms. Теперь я вижу строку-каналы, как это в пользовательском интерфейсе.

0 голосов
/ 19 ноября 2010

Вы пытались убедиться, что текстовое поле находится в многострочном режиме и принимает возврат каретки ?

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!";
 }
0 голосов
/ 14 ноября 2010

Вы можете использовать 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 строка.

0 голосов
/ 12 ноября 2010

Каждый раз, когда вы конвертируете документ XML в строку и начинаете манипулировать строкой, вам следует подумать: «Сам, я делаю что-то не так». Я не уверен из твоего описания, правда ли это, но держу пари, что это так.

Если пробел в XML, который вы извлекаете из базы данных, значителен, вы хотите сохранить его, когда разберете его в XElement. Для этого используйте перегрузку XElement.Parse, которая делает это, например ::10000

XElement testXmlNode = XElement.Parse(xmlFromDbWithLFChars, LoadOptions.PreserveWhitespace);

Когда вы это сделаете, парсер оставит символы пробела в проанализированных текстовых узлах XElement документа именно там, где они были в исходной строке. XmlWriter не связывается с существующими пробелами в текстовых узлах (хотя он добавит новые пробелы, если вы укажете отступ), так что это должно дать вам то, что вы хотите.

...