Làm cách nào tôi có thể làm cho xmlserializer chỉ tuần tự hóa xml thuần túy?


85

Tôi cần lấy xml đơn giản, không có phần tử <?xml version="1.0" encoding="utf-16"?>ở đầu và xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"ở phần tử đầu tiên XmlSerializer. Tôi làm nó như thế nào?

Câu trả lời:


211

Để kết hợp tất cả những điều này lại với nhau - điều này hoàn toàn phù hợp với tôi:

    // To Clean XML
    public string SerializeToString<T>(T value)
    {
        var emptyNamespaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
        var serializer = new XmlSerializer(value.GetType());
        var settings = new XmlWriterSettings();
        settings.Indent = true;
        settings.OmitXmlDeclaration = true;

        using (var stream = new StringWriter())
        using (var writer = XmlWriter.Create(stream, settings))
        {
            serializer.Serialize(writer, value, emptyNamespaces);
            return stream.ToString();
        }
    }

1
using (var stream = new StringWriter ()) có thể được thay đổi thành var stream = new StringWriter (); Đưa ra lỗi với phân tích mã vì có thể xử lý xmlwriter hai lần.
Archna

1
@Archna Nếu bạn đã làm điều đó, StringWriter sẽ không bị loại bỏ trong trường hợp lệnh gọi XmlWriter.Create ném một ngoại lệ. Một giải pháp khả thi bao gồm các tác giả XmlWriter độc hại thực hiện triển khai IDispose không tuân theo đảm bảo rằng việc thực thi Dispose hai lần không thực hiện gì cho lần gọi thứ hai sẽ liên quan đến luồng thử bắt và cài đặt thành null bên trong using( writer ), như có thể thấy trong câu hỏi này: stackoverflow.com/a/11192524/2144408 .
TamaMcGlinn

Bạn đang sử dụng tham số kiểu T để làm gì?
Jesper

25

Sử dụng XmlSerializer.Serializequá tải phương thức nơi bạn có thể chỉ định không gian tên tùy chỉnh và chuyển vào đó điều này.

var emptyNs = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });
serializer.Serialize(xmlWriter, objectToSerialze, emptyNs);

truyền null hoặc mảng trống sẽ không thực hiện thủ thuật


7
Xin lưu ý rằng bạn cần kết hợp câu trả lời này với câu trả lời của @ tobsen để có được những gì tôi yêu cầu - một xml thực sự sạch!
Grzenio


0

Điều này sẽ ghi XML vào một tệp thay vì một chuỗi. Đối tượng vé là đối tượng mà tôi đang tuần tự.

Không gian tên được sử dụng:

using System.Xml;
using System.Xml.Serialization;

Mã:

XmlSerializerNamespaces emptyNamespaces = new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty });

XmlSerializer serializer = new XmlSerializer(typeof(ticket));

XmlWriterSettings settings = new XmlWriterSettings
{
    Indent = true,
    OmitXmlDeclaration = true
};

using (XmlWriter xmlWriter = XmlWriter.Create(fullPathFileName, settings))
{
    serializer.Serialize(xmlWriter, ticket, emptyNamespaces); 
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.