2012-01-19 25 views
14

Tôi có đoạn mã sau:Tại sao XDocument của tôi lưu bản khai báo khi tôi không muốn nó?

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var stream = File.Create(@"C:\test.xml")) 
     { 
      var xml = 
       new XElement("root", 
        new XElement("subelement1", "1"), 
        new XElement("subelement2", "2")); 

      var doc = new XDocument(xml); 
      doc.Declaration = null; 
      doc.Save(stream); 
     } 
    } 
} 

tôi đang cố gắng để có được XML để tiết kiệm mà không cần khai báo xml, nhưng mặc dù tôi đang nulling ra tuyên bố của XDocument, nó vẫn đang được lưu vào XML thức .

Mã này được xuất ra:

<?xml version="1.0" encoding="utf-8"?> 
<root> 
    <subelement1>1</subelement1> 
    <subelement2>2</subelement2> 
</root> 
+0

Tại sao bạn muốn lưu một tài liệu XML mà không cần khai báo? Nó rất hữu ích để bao gồm một khai báo chỉ định mã hóa và phiên bản của tài liệu XML cho người tiêu dùng của tệp XML. –

+0

Bởi vì XML này đang được gửi đến một số hệ thống khác trong công ty mà có thể phá vỡ nếu bạn có khai báo xml (và tôi không có quyền kiểm soát các hệ thống đó, đó là một bộ phận khác) – KallDrexx

+0

đủ công bằng :) Tôi chỉ thắc mắc tại sao –

Trả lời

13

Thay vào đó XDocument.Save() bạn có thể sử dụng XmlWriter với XmlWriterSettings.OmitXmlDeclaration thiết lập để true

using System.IO; 
using System.Xml; 
using System.Xml.Linq; 

XmlWriterSettings xws = new XmlWriterSettings(); 
xws.OmitXmlDeclaration = true; 
xws.Indent = true; 

using (var stream = File.Create(@"C:\test.xml")) 
using (XmlWriter xw = XmlWriter.Create(stream, xws)) 
{ 
    var xml = new XElement(
     "root", 
     new XElement("subelement1", "1"), 
     new XElement("subelement2", "2")); 

    xml.Save(xw); 
} 
+1

I không thể tìm thấy phương pháp này, bạn có thể vui lòng cung cấp liên kết tới 'MSDN' không? – gdoron

+0

Tôi đã cung cấp ví dụ nhanh cho bạn, xem câu trả lời cập nhật – sll

+1

Cảm ơn bạn! – KallDrexx

7

Bạn thể làm điều này bằng XmlWriter với một tuỳ chỉnh XmlWriterSettings (bạn sẽ cần một chỉ thị sử dụng cho System.Xml):

using System; 
using System.IO; 
using System.Xml; 
using System.Xml.Linq; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var xml = 
      new XElement("root", 
         new XElement("subelement1", "1"), 
         new XElement("subelement2", "2")); 

     var doc = new XDocument(xml); 
     var settings = new XmlWriterSettings 
     { 
      OmitXmlDeclaration = true 
     }; 
     using (var stream = File.Create(@"test.xml")) 
     { 
      using (var writer = XmlWriter.Create(stream, settings)) 
      { 
       doc.Save(writer); 
      } 
     } 
    } 
} 

Đó là giả sử bạn muốn xác định Stream - bạn cũng có thể tạo ra một XmlWriter từ filename:

using (var writer = XmlWriter.Create("test.xml", settings)) 
{ 
    doc.Save(writer); 
} 

(Nếu bạn không cần XDocument cho bất cứ điều gì khác, bạn chỉ có thể gọi Save trên phần tử gốc, tất nhiên, theo cùng một cách.)

+1

EDIT: nếu bạn KHÔNG sử dụng mã của Jon thì nó vẫn thêm khai báo như phương thức 'XDocument.Save' gọi phương thức' XNode.GetXmlWriterSettings', sau đó trả về một đối tượng 'XmlWriterSettings' mới, có' OmitXmlDeclaration' được đặt thành false theo mặc định –

+0

@JamesShuttler: Đoạn mã trên không * không * viết khai báo cho tôi. Bạn đã thử nó và thấy rằng nó đã làm? –

+0

Tại sao bạn xây dựng nội dung 'XML' trong' XElement' và sau đó chèn nó vào 'XDocument'. Thay vì xây dựng toàn bộ 'XML' bằng' XDocument'? – gdoron

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