2010-03-03 34 views
21

Tôi có một đối tượng XDocument và phương thức ToString() trả về XML mà không có bất kỳ thụt lề nào. Làm cách nào để tạo chuỗi từ XML có chứa thụt lề này?Làm thế nào để bạn tạo một chuỗi XML thụt vào từ một XDocument trong C#?

chỉnh sửa: Tôi hỏi cách tạo chuỗi trong bộ nhớ thay vì ghi vào tệp.

chỉnh sửa: Có vẻ như tôi vô tình hỏi một câu hỏi mẹo ở đây ... ToString() trả về XML thụt vào.

+0

Bạn có thể gửi mã của bạn? Cách duy nhất tôi có thể nhận được XDocument.ToString để không thụt lề XML là khi tôi chuyển một cách rõ ràng trong SaveOptions.DisableFormatting sang phương thức ToString. –

+0

Tôi đã thử câu trả lời ở đây. Họ không có hiệu lực (vẫn còn sử dụng không gian). Sử dụng .Net 4 (không phải máy khách). –

+0

Liên quan: http://stackoverflow.com/questions/1123718/format-xml-string-to-print-friendly-xml-string – CJBS

Trả lời

19
XDocument doc = XDocument.Parse(xmlString); 
string indented = doc.ToString(); 
+9

Điều này hoạt động tốt. 'XDocument.ToString()' định dạng với thụt đầu dòng theo mặc định. Để có được đầu ra chưa được định dạng, bạn phải đi ra khỏi con đường của bạn bằng cách gọi '. ToString (SaveOptions.DisableFormatting)' –

+1

Tôi đã thực sự tìm kiếm vô hiệu hóa. Cảm ơn @JoelMueller – Eric

9

Từ here

XmlDocument doc = new XmlDocument(); 
doc.LoadXml("<item><name>wrench</name></item>"); 

// Save the document to a file and auto-indent the output. 
XmlTextWriter writer = new XmlTextWriter("data.xml",null); 
writer.Formatting = Formatting.Indented; 
doc.Save(writer); 
+0

Câu hỏi đặt ra là cách tạo chuỗi, chứ không phải cách tạo tệp. –

+1

@JC: Sử dụng StringWriter thay vì tên tệp trong hàm tạo của XmlTextWriter để nhận chuỗi. –

+1

-1: Không sử dụng 'new XmlTextWriter()' hoặc 'new XmlTextReader()' qua .NET 1.1. Sử dụng 'XmlWriter.Create()' hoặc 'XmlReader.Create()'. –

2

Để tạo một chuỗi sử dụng một XDocument (chứ không phải là một XmlDocument), bạn có thể sử dụng:

 XDocument doc = new XDocument(
      new XComment("This is a comment"), 
      new XElement("Root", 
       new XElement("Child1", "data1"), 
       new XElement("Child2", "data2") 
      ) 
     ); 

     XmlWriterSettings settings = new XmlWriterSettings(); 
     settings.Indent = true; 
     StringBuilder sb = new StringBuilder(); 
     using (XmlWriter writer = XmlTextWriter.Create(sb, settings)) { 
      doc.WriteTo(writer); 
      writer.Flush(); 
     } 
     string outputXml = sb.ToString(); 

Edit: cập nhật để sử dụng XmlWriter.CreateStringBuilder và hình thức tốt (using).

+1

-1: Không sử dụng XmlTextWriter mới() hoặc mới XmlTextReader() qua .NET 1.1. Sử dụng XmlWriter.Create() hoặc XmlReader.Create() –

+1

Cảm ơn, tôi đã bỏ lỡ điều đó. Tôi cập nhật mẫu cho phù hợp (và giảm độ phức tạp với một StringBuilder cùng một lúc!) – DocMax

+0

FYI, trên xem xét, tôi vẫn muốn giữ downvote của tôi bởi vì bạn đã không sử dụng một 'sử dụng' khối. –

7

Chỉ cần một hương vị của súp cùng ... ;-)

StringWriter sw = new StringWriter(); 
XmlTextWriter xw = new XmlTextWriter(sw); 
xw.Formatting = Formatting.Indented; 
doc.WriteTo(xw); 
Console.WriteLine(sw.ToString()); 

Edit: nhờ John Saunders. Đây là một phiên bản tốt hơn nên phù hợp với Creating XML Writers on MSDN.

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

class Program 
{ 
    static void Main(string[] args) 
    { 
     XDocument doc = new XDocument(
     new XComment("This is a comment"), 
     new XElement("Root", 
      new XElement("Child1", "data1"), 
      new XElement("Child2", "data2") 
      ) 
      ); 

     var builder = new StringBuilder(); 
     var settings = new XmlWriterSettings() 
     { 
      Indent = true 
     }; 
     using (var writer = XmlWriter.Create(builder, settings)) 
     { 
      doc.WriteTo(writer); 
     } 
     Console.WriteLine(builder.ToString()); 
    } 
} 
+3

Ưu tiên điều này cho tôi, nhưng bạn sử dụng ở đâu? – tomfanning

+1

-1: Không sử dụng XmlTextWriter mới() hoặc mới XmlTextReader() qua .NET 1.1. Sử dụng XmlWriter.Create() hoặc XmlReader.Create() –

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