2014-12-18 3 views
5

Ich versuche, XML-Datei gespeichert sein Format zu bearbeiten:Neues XElements mit neuer Linie in XDocument mit PreserveWhitespace Loadoptions

<root> 
    <files> 
     <file>a</file> 

     <file>b</file> 
     <file>c</file> 



     <file>d</file> 
    </files> 
</root> 

So laden i XML-Dokument mit
XDocument xDoc = XDocument.Load(path, LoadOptions.PreserveWhitespace);
Aber wenn ich zu versuchen bin hinzufügen neuer Elemente
xDoc.Root.Element("files").Add(new XElement("test","test")); xDoc.Root.Element("files").Add(new XElement("test2","test2"));
es in der gleichen Zeile ergänzt, so ausgegeben wie:

<root> 
    <files> 
     <file>a</file> 

     <file>b</file> 
     <file>c</file> 



     <file>d</file> 
    <test>test</test><test2>test2</test2></files> 
</root> 

Also, wie kann ich neue Elemente in jeder neuen Zeile hinzufügen und die ursprüngliche Formatierung speichern? Ich habe versucht, XmlWriter mit Setting.Indent = true zu verwenden XDocument zu retten, aber wie ich sehe, sind Elemente der gleichen Zeile hinzugefügt, wenn ich xDoc.Root.Element().Add()

Update: Voll Teil der Programmladen, Modifizieren und Speichern von Dokument

using System; 
using System.Xml; 
using System.Xml.Linq; 
using System.Text; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     {    
      string path = @".\doc.xml";  
      XDocument xDoc = XDocument.Load(path, LoadOptions.PreserveWhitespace); 

      //when i debug i see in "watch" that after these commands new elements are already added in same line 
      xDoc.Descendants("files").First().Add(new XElement("test", "test")); 
      xDoc.Descendants("files").First().Add(new XElement("test2", "test2")); 

      XmlWriterSettings settings = new XmlWriterSettings(); 
      settings.Encoding = Encoding.UTF8; 
      settings.Indent = true; 
      settings.IndentChars = "\t"; 

      using (XmlWriter writer = XmlTextWriter.Create(path, settings)) 
      {     
       xDoc.Save(writer); 
       //Here i also tried save without writer - xDoc.Save(path) 
      } 
     } 
    } 
} 
+0

zeigen Sie eine kurze, aber * komplette * Programm zur Demonstration der Problem, einschließlich, wie Sie mit den Einrückungseinstellungen speichern ... –

+0

Das ist immer noch kein kurzes aber komplettes Programm. Es sollte etwas sein, das wir kopieren, einfügen, kompilieren und ausführen können, ohne eine "Main" -Methode usw. hinzuzufügen. –

+0

@JonSkeet getan, wie Sie es wünschen –

Antwort

7

Das Problem scheint durch die Verwendung von LoadOptions.PreserveWhitespace verursacht worden zu sein. Dies scheint zu trumpfen XmlWriterSettings.Indent - Sie haben im Grunde gesagt, "Ich interessiere mich für diese Whitespace" ... "Oh, jetzt tue ich nicht."

Wenn Sie diese Option entfernen, nur mit:

XDocument xDoc = XDocument.Load(path); 

... dann rückt sie entsprechend. Wenn Sie alle ursprünglichen Leerzeichen beibehalten möchten, aber dann nur die neuen Elemente einrücken, denke ich, dass Sie diese Einrückung selbst hinzufügen müssen.

+1

das ist das Hauptproblem: Wie kann ich Einzug für neue Elemente selbst hinzufügen? –

+0

@AlexeevMikhail: Sie müssen vor jedem Element explizit einen Textknoten mit der richtigen Anzahl von Registerkarten (und einem Zeilenumbruch) hinzufügen. Brauchst du wirklich 'PreserveWhitesspace'? –

+0

Das ist der Wunsch der Person, die ich dieses Programm für, also ja, ich brauche es wirklich, danke =) –

5

Ich hatte ein ähnliches Problem und ich konnte mit dem Code lösen unter:

var newPolygon = new XElement(doc.Root.GetDefaultNamespace() + "polygon"); 
groupElement.Add(newPolygon); 
groupElement.Add(Environment.NewLine); 

ich diesen Code hoffen einige Leute helfen ...