2014-12-18 13 views
5

Tôi đang cố gắng để chỉnh sửa tập tin XML tiết kiệm định dạng của nó:Thêm XElements mới với dòng sản phẩm mới trong XDocument với LoadOptions PreserveWhitespace

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

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



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

Vì vậy, tôi tải tài liệu xml sử dụng
XDocument xDoc = XDocument.Load(path, LoadOptions.PreserveWhitespace);
Nhưng khi tôi đang cố gắng để thêm các yếu tố mới
xDoc.Root.Element("files").Add(new XElement("test","test")); xDoc.Root.Element("files").Add(new XElement("test2","test2"));
nó cho biết thêm trong cùng một dòng, vì vậy sản lượng giống như:

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

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



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

Vậy làm cách nào tôi có thể thêm các phần tử mới trên mỗi dòng mới để lưu định dạng ban đầu? Tôi cố gắng để sử dụng XmlWriter với Setting.Indent = true để lưu XDocument, nhưng như tôi thấy, các yếu tố được thêm vào cùng một dòng, khi tôi sử dụng xDoc.Root.Element().Add()

Cập nhật: tham gia đầy đủ của chương trình tải, sửa đổi và tiết kiệm tài liệu

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

Hãy thể hiện một đoạn ngắn nhưng * hoàn * Chương trình thể hiện sự vấn đề, bao gồm cách bạn đang tiết kiệm với các cài đặt thụt đầu dòng ... –

+0

Đó vẫn chưa phải là một chương trình ngắn nhưng đầy đủ. Nó phải là một cái gì đó chúng ta có thể sao chép, dán, biên dịch và chạy, mà không rối tung xung quanh thêm một phương pháp 'Main', vv –

+0

@ JonSkeet thực hiện như bạn muốn –

Trả lời

7

Sự cố có vẻ là do bạn sử dụng LoadOptions.PreserveWhitespace. Điều này dường như át chủ bài XmlWriterSettings.Indent - về cơ bản bạn đã nói, "Tôi quan tâm đến khoảng trống này" ... "Ồ, bây giờ tôi không."

Nếu bạn loại bỏ tùy chọn đó, chỉ sử dụng:

XDocument xDoc = XDocument.Load(path); 

... sau đó nó indents một cách thích hợp. Nếu bạn muốn giữ lại tất cả các khoảng trắng gốc nhưng sau đó chỉ thụt lề các phần tử mới, tôi nghĩ bạn sẽ cần thêm chính bản thân thụt đầu dòng đó.

+1

đó là vấn đề chính: làm thế nào tôi có thể thêm indentation cho các yếu tố mới bản thân mình? –

+0

@AlexeevMikhail: Bạn cần thêm rõ ràng một nút văn bản với số lượng tab phù hợp (và ngắt dòng) trước mỗi phần tử. Bạn có * thực sự * cần 'PreserveWhitespace'? –

+0

Đó là mong muốn của người mà tôi làm chương trình này, vì vậy, tôi thực sự cần nó, cảm ơn bạn =) –

5

Tôi đã có một vấn đề tương tự và tôi có thể giải quyết với mã dưới đây:

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

Tôi hy vọng mã này có thể giúp một số người ...

Các vấn đề liên quan