2010-11-12 3 views
6

У меня есть строка xml, хранящаяся в таблице db с символами строки. В моей программе C# 3.5 я загружаю и обрабатываю ее с помощью Linq в xml, а затем показываю ее как строку в элементе управления текстовыми полями в форме пользовательского интерфейса.Сохранение специальных символов в xml

Мне нужно отложить этот 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> 
+0

Сохраняя, вы имеете в виду, что вы хотите, чтобы новые строки XML работали как новые строки в пользовательском интерфейсе? – BeemerGuy

+0

да, это правильно Beemer. – user40907

+0

Еще один вопрос: когда вы говорите «// не работает», вы имеете в виду, что он показывает две новые строки или вообще ничего? – BeemerGuy

ответ

3

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

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

Чтобы что-то вроде этого:

var settings = new XmlWriterSettings() 
    { 
    Indent = true, 
    IndentChars = "\n", 
    NewLineOnAttributes = true 
    }; 
+0

Спасибо Almund! Единственное, что я пропустил в своем первоначальном подходе, это использовать «NewLineOnAttributes = true», и это, похоже, отлично работает !!! – user40907

+0

Легко пропустить, рад, что это помогло! – Almund

0

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

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

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

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

+0

Привет, Роберт, спасибо за ваш ответ ... но этот подход не сработает для меня ...я все еще не вижу строк в XML в текстовом поле в пользовательском интерфейсе. – user40907

+1

Когда вы говорите «textarea», вы имеете в виду HTML TEXTAREA? Поскольку новые линии в элементе TEXTAREA обозначаются парами CR/LF. Если у вас просто есть символы LF в тексте XML, они не будут отображаться как новые строки в TEXTAREA. –

+0

Его элемент управления текстовым полем .Net Winform. – user40907

0

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

спасибо за ваш ответ ... Мне нужно использовать объект XmlReaderSettings здесь, чтобы сохранить форматирование? – user40907

+0

@ user40907 Нет, вы можете использовать код как есть, просто загрузите свой собственный XML в виде чистого текста. –

+0

Shadow, я пробовал этот подход XmlReader ... но все же он не работает. – user40907

1

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

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

+0

вы должны добавить решение, которое вы использовали в качестве ответа. – Mauro

+0

«Генерация xml с помощью StringBuilder» - извините, но в аду нет способа это правильно. XML - это не строковые данные, пытаясь рассматривать его как таковой, если это регулярное выражение регулярного выражения или сборка строковых сборщиков не имеет строгого строя, является хрупким для обслуживания и чрезвычайно подвержено человеческой ошибке. – annakata

+0

Annakata, что ур говорит, правда, но, к сожалению, я не могу дать такое же оправдание делу .... так как я не хотел идти по StringBuilder, зная, что это wud будет хрупким кодом, я сначала попытался с Linq2API, SAX и DOM парсер ... но cudnt получает желаемый отформатированный вывод. Спасибо. – user40907

0

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

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!"; 
} 
Смежные вопросы