2010-11-12 24 views
6

Ich habe eine XML-Zeichenfolge in der db-Tabelle mit Zeilenvorschubzeichen gespeichert. In meinem C# 3.5-Programm, ich lade und manipuliere es mit Linq zu Xml und dann zeigen Sie es als eine Zeichenfolge in das Textfeld Steuerelement auf der UI-Formular.Sonderzeichen in XML beibehalten

Ich muss dieses XML einrücken sowie Zeilenvorschub/Wagenrücklauf beibehalten, während es in der Benutzeroberfläche angezeigt wird.

Ich kann es einrücken, aber wie konserviere ich LF/CR Zeichen in der XML ??

Hier ist die Probe C# -Code: „Selbst, ich etwas falsch mache“

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

Mit beibehalten, meinen Sie, dass die XML-Zeilen wie neue Zeilen in der Benutzeroberfläche fungieren sollen? – BeemerGuy

+0

ja, das ist richtig Beemer. – user40907

+0

Noch eine Frage: Wenn Sie sagen "// funktioniert nicht", meinen Sie, dass es zwei oder gar keine Zeilen enthält? – BeemerGuy

Antwort

3

Was Sie tun möchten, ist es, die Einstellungen der Formatierung auf dem XmlWriter zu setzen, so dass Ihre Zeile ändern:

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

Um so etwas wie diese:

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

Dank Almund! .Der einzige, was ich in meiner ursprünglichen Ansatz verpasst hatte, war mit „NewLineOnAttributes = true“ und das scheint zu funktionieren groß !!! – user40907

+0

Einfach zu verpassen, froh, dass es geholfen hat! – Almund

0

Jedes Mal, wenn Sie ein XML-Dokument in eine Zeichenfolge konvertieren und starten Sie die Zeichenfolge zu manipulieren, die Sie sich selbst denken sollte, Ich bin mir nicht sicher, ob das stimmt, aber ich wette, es ist so.

Wenn das Leerzeichen in der XML-Datei, die Sie aus der Datenbank ziehen, signifikant ist, möchten Sie es beibehalten, wenn Sie es in Ihre XElement analysieren. Um dies zu tun, verwenden Sie die Überlastung von XElement.Parse, das dies tut, z.B .:

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

Wenn Sie dies tun, wird der Parser Leerzeichen in den analysierten XElement Dokuments Textknoten lassen, wo genau sie in der ursprünglichen Zeichenfolge waren. XmlWriter wird nicht mit vorhandenen Leerzeichen in Textknoten verwechselt (obwohl es neue Leerzeichen hinzufügen wird, wenn Sie es zum Einrücken sagen), so sollte dies Sie bekommen, was Sie wollen.

+0

Hallo Robert, danke für deine Antwort ... aber dieser Ansatz funktioniert nicht für mich ...Ich sehe immer noch Zeilenvorschübe in der XML in Textarea in UI. – user40907

+1

Wenn Sie "Textarea" sagen, meinen Sie ein HTML TEXTAREA? Weil neue Zeilen in einem TEXTAREA-Element durch CR/LF-Paare angezeigt werden. Wenn Sie nur LF-Zeichen im XML-Text haben, werden sie nicht als Zeilenumbrüche in einem TEXTAREA dargestellt. –

+0

Es ist ein Textbox-Steuerelement auf einem .Net Winform. – user40907

0

Sie XmlReader verwenden können, die neuen Linien und alles zu erhalten .. hier ist Beispielcode, der gut für mich gearbeitet, als Test:

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; 

In meinem Test habe ich XML-Datei geladen, können Sie Ihre manipulierten XML laden Zeichenfolge.

+0

danke für deine Antwort ... Muss ich hier das XmlReaderSettings-Objekt verwenden, um die Formatierung beizubehalten? – user40907

+0

@ user40907 nein, Sie können den Code verwenden, wie er ist, laden Sie einfach Ihre eigenen XML als reinen Text. –

+0

Schatten, habe ich versucht, diesen XmlReader Ansatz ... aber immer noch funktioniert es nicht .... – user40907

1

Dank alle für Ihre Antworten. Endlich könnte ich das funktionieren lassen.

Mein Ansatz verwendet nicht Linq2Xml/SAX-Parser.Am Generieren der XML-Datei mit StringBuilder und zeigt es in der Benutzeroberfläche in einem Winforms-Rich-Textfeld-Steuerelement. Jetzt kann ich sehen, Zeilen-Feeds wie es in der Benutzeroberfläche ist.

+0

sollten Sie die Lösung hinzufügen, die Sie als Antwort verwendet haben. – Mauro

+0

„Erzeugen des XML String“ - Es tut mir leid, aber es gibt keinen Weg in die Hölle, das ist richtig. XML ist nicht String-Daten und versucht, sie als solche zu behandeln, ob die Regex Parsen oder String Montage ist fehlt Strenge, ist spröde für die Wartung und ist extrem anfällig für menschliche Fehler. – annakata

+0

annakata, was ur Spruch wahr ist, aber leider kann ich nicht der gleiche Begründung Unternehmen geben .... da ich zu wissen, den String Weg gehen, will nicht, dass es instabil Code seines wud, versuchte ich zuerst mit Linq2API, SAX und DOM Parser ... aber klasse bekomme die gewünschte formatierte Ausgabe. Danke. – user40907

0

Haben Sie versucht, sicherzustellen, dass die Textbox im Multiline-Modus ist und 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!"; 
}