2016-04-27 15 views
0

Ich muss ein XML in C# schreiben und ich möchte den Text formatiert. Das sind meine Einstellungen:C# XlmWriter automatische Einrückung Zeichenfolge in geschriebenen Text

XmlWriterSettings settings = new XmlWriterSettings 
{ 
    Indent = true, 
    IndentChars = ("\t"), 
    NewLineChars = "\r\n", 
    NewLineHandling = NewLineHandling.Replace 
}; 

XmlWriter xmlWriter = XmlWriter.Create(path + "//" + nome, settings); 

Nach dem Header und die ersten Knoten sollte ich diese Zeichenfolge einfügen:

string st = "\r\nLINE 1\r\nLINE 2\r\nLINE 3\r\n"; 

Und ich würde diese gerne formatiert werden, wie folgt:

<Text> 
      LINE 1 
      LINE 2 
      LINE 3 
    </Text> 

ich schrieb diesen Code:

xmlWriter.WriteString(st); 
+0

Verwenden 'XmlWriter.WriteElementString ("Text", st); '[siehe hier] (https://msdn.microsoft.com/en-US/library/aex0e7zs%28v=vs.110%29.aspx) oder je nach Komplexität einen' XmlSerializer verwenden '. – Adwaenyth

Antwort

0

Um ein solches Ergebnis zu erzielen Sie eine benutzerdefinierte XmlWriter implementieren sollten:

public class IndentTextXmlWriter : XmlTextWriter 
{ 
    private int indentLevel; 
    private bool isInsideAttribute; 

    public IndentTextXmlWriter(TextWriter textWriter): base(textWriter) 
    { 
    } 

    public bool IndentText { get; set; } 

    public override void WriteStartAttribute(string prefix, string localName, string ns) 
    { 
     isInsideAttribute = true; 
     base.WriteStartAttribute(prefix, localName, ns); 
    } 

    public override void WriteEndAttribute() 
    { 
     isInsideAttribute = false; 
     base.WriteEndAttribute(); 
    } 

    public override void WriteStartElement(string prefix, string localName, string ns) 
    { 
     indentLevel++; 
     base.WriteStartElement(prefix, localName, ns); 
    } 

    public override void WriteEndElement() 
    { 
     indentLevel--; 
     base.WriteEndElement(); 
    } 

    public override void WriteString(string text) 
    { 
     if (String.IsNullOrEmpty(text) || isInsideAttribute || Formatting != Formatting.Indented || !IndentText || XmlSpace == XmlSpace.Preserve) 
     { 
      base.WriteString(text); 
      return; 
     } 

     string[] lines = text.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); 
     string indent = new string(IndentChar, indentLevel * Indentation); 
     foreach (string line in lines) 
     { 
      WriteRaw(Environment.NewLine); 
      WriteRaw(indent); 
      WriteRaw(line.Trim()); 
     } 

     WriteRaw(Environment.NewLine); 
     WriteRaw(new string(IndentChar, (indentLevel - 1) * Indentation)); 
    } 
} 

Sie können es wie folgt verwenden:

[TestMethod] 
public void WriteIndentedText() 
{ 
    var result = new StringBuilder(); 
    using (var writer = new IndentTextXmlWriter(new StringWriter(result)){Formatting = Formatting.Indented, IndentText = true}) 
    { 
     string text = @" Line 1 
Line 2 
    Line 3 "; 
     // some root 
     writer.WriteStartDocument(); 
     writer.WriteStartElement("root"); 
     writer.WriteStartElement("child"); 

     // test auto-indenting 
     writer.WriteStartElement("elementIndented"); 
     writer.WriteString(text); 
     writer.WriteEndElement(); 

     // test space preserving 
     writer.WriteStartElement("elementPreserved"); 
     writer.WriteAttributeString("xml", "space", null, "preserve"); 
     writer.WriteString(text); 

     writer.WriteEndDocument(); 
    } 

    Debug.WriteLine(result.ToString()); 
} 

Und die Ausgabe:

<?xml version="1.0" encoding="utf-16"?> 
<root> 
    <child> 
    <elementIndented> 
     Line 1 
     Line 2 
     Line 3 
    </elementIndented> 
    <elementPreserved xml:space="preserve"> Line 1 
Line 2 
    Line 3 </elementPreserved> 
    </child> 
</root> 
+0

Vielen Dank für Ihre umfassende Antwort, eine Sache, können Sie mir sagen, wie man den Ordner, in dem die XML (der String-Pfad) speichern – Delta

+0

einen weiteren Konstruktor übergeben: Public IndentTextXmlWriter (String Dateiname, Encoding-Codierung): Basis (filename, encoding) {} ' – taffer

+0

Diese Klasse die virtuelle Variable richtig einrücken, schreibt aber fälschlicherweise Dateien, warum? mit (var = new xmlWriter IndentTextXmlWriter (Pfad + "//" + name, Encoding.UTF8) = {Formatierung Formatierung.Zeilig, IndentText = True}) – Delta