2011-08-09 25 views
7

Trong đoạn mã sau tôi muốn đặt "standalone = yes" thành xml, làm cách nào tôi có thể thực hiện việc này?Cài đặt StandAlone = Yes in .Net khi tuần tự hóa một đối tượng

Dim settings As New Xml.XmlWriterSettings 
settings.Encoding = encoding 

Using stream As New IO.MemoryStream, xtWriter As Xml.XmlWriter = _ 
    Xml.XmlWriter.Create(stream, settings) 
    serializer.Serialize(xtWriter, obj) 
    Return encoding.GetString(stream.ToArray()) 
End Using 

Ví dụ, tôi có điều này:

<?xml version="1.0" encoding="utf-8"?> 

Nhưng tôi muốn điều này:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 

Trả lời

7

Nếu bạn muốn làm điều này thì bạn sẽ cần phải sử dụng phương pháp WriteProcessingInstruction và bằng tay viết ra.

Using stream As New IO.MemoryStream, xtWriter As Xml.XmlWriter = Xml.XmlWriter.Create(stream, settings) 
     xtWriter.WriteProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8"" standalone=""yes""") 
     serializer.Serialize(xtWriter, obj) 
     Return encoding.GetString(stream.ToArray()) 
    End Using 
+0

Cảm ơn bạn, điều đó vẫn không thanh lịch như tôi mong đợi, nhưng vẫn tốt hơn .Replace ("", ""). lol –

+2

Bạn có thể sử dụng xmlriter.WriteStartDocument (true); –

+0

@HasaniBlackwell ugh, ngay bây giờ tôi nhận thấy rằng nhận xét ....... đó sẽ là câu trả lời tôi đang tìm kiếm! –

10

Tôi đã tìm thấy một cách nhiều thanh lịch hơn để làm điều này: chỉ cần gọi WriteStartDocument(true) trên XmlWriter dụ của bạn - mã này serializes data và kết quả đầu ra XML kết quả ra màn hình.

Thứ nhất, nếu bạn đang sử dụng một StringWriter bạn cần phải tinh chỉnh nó một chút để buộc UTF-8, nhưng keep this in mind:

Khi serialising một tài liệu XML thành một chuỗi NET, mã hóa phải được đặt thành UTF-16. Các chuỗi được lưu trữ dưới dạng UTF-16 trong nội bộ, vì vậy đây là mã hóa duy nhất có ý nghĩa. Nếu bạn muốn lưu trữ dữ liệu trong một bảng mã khác, thay vào đó bạn sử dụng một mảng byte.

public sealed class Utf8StringWriter : StringWriter 
{ 
    public override Encoding Encoding { get { return Encoding.UTF8; } } 
} 
using (var sw = new Utf8StringWriter()) 
using (var xw= XmlWriter.Create(sw, new XmlWriterSettings{Indent = true})) 
{ 
    xw.WriteStartDocument(true); // that bool parameter is called "standalone" 

    var namespaces = new XmlSerializerNamespaces(); 
    namespaces.Add(string.Empty, string.Empty); 

    var xmlSerializer = new XmlSerializer(typeof(data)); 
    xmlSerializer.Serialize(xw, data); 

    Console.WriteLine(sw.ToString()); 
} 

WriteStartDocument(true) thực sự cảm thấy như cách thành ngữ chỉ định standalone=true. Tiêu đề đầu ra trông giống như sau:

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
+2

Có lẽ 'xw.WriteStartDocument (standalone: ​​= true)' sẽ là một sử dụng tốt của args được đặt tên? – RubberDuck

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