Вопрос

У меня String XML хранится в таблице БД с символами подачи линий. В моей программе C # 3.5 я загружаю и манипулирую его с помощью Linq к XML, а затем показать его как строку в управлении текстовым ящиком в форме UI.

Мне нужно отступить для этого XML, а также сохранить линии подачи / возврата каретки, пока она показывая ее в интерфейсе UI.

Могу отступить это, но как мне сохранить LF / CR Chars в 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>
Это было полезно?

Решение

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

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

К чему-то вроде это:

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

Другие советы

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

Мой подход не использует linq2xml / sax parser.am, генерируя XML, используя StringBuilder и показывать его в UI в управлении 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;

В моем тесте i загрузил файл XML, вы можете загрузить свою манипулировать XML String.

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

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!";
 }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top