ฉันจะทำให้ xmlserializer เป็นซีเรียลไลซ์เท่านั้น xml ธรรมดาได้อย่างไร


86

ฉันต้องการรับ xml ธรรมดาโดยไม่มี<?xml version="1.0" encoding="utf-16"?>จุดเริ่มต้นและxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"ในองค์ประกอบแรกจากXmlSerializer. ฉันจะทำมันได้อย่างไร?

คำตอบ:


217

เพื่อรวบรวมทั้งหมดนี้ - ใช้ได้ดีสำหรับฉัน:

    // 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
การใช้ (var stream = new StringWriter ()) สามารถเปลี่ยนเป็น var stream = new StringWriter (); ให้ข้อผิดพลาดกับการวิเคราะห์โค้ดเนื่องจากการกำจัด xmlwriter สองครั้ง
Archna

1
@Archna หากคุณทำเช่นนั้น StringWriter จะไม่ถูกกำจัดในกรณีที่การเรียก XmlWriter.Create ส่งข้อยกเว้น วิธีแก้ปัญหาที่เป็นไปได้ที่ครอบคลุมผู้เขียน XmlWriter ที่เป็นอันตรายซึ่งทำการใช้งาน IDispose ซึ่งไม่เป็นไปตามการรับประกันว่าการดำเนินการ Dispose สองครั้งไม่ได้ทำอะไรเลยสำหรับการเรียกครั้งที่สองจะเกี่ยวข้องกับการลองจับและตั้งค่าสตรีมให้เป็นโมฆะภายในusing( writer )ดังที่เห็นในคำถามนี้: stackoverflow.com/a/11192524/2144408
TamaMcGlinn

คุณใช้ type-parameter T เพื่ออะไร?
Jesper

25

ใช้XmlSerializer.Serializeเมธอด overload ซึ่งคุณสามารถระบุเนมสเปซที่กำหนดเองและส่งผ่านไปที่นั่น

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

การส่งอาร์เรย์ว่างหรือว่างจะไม่ทำเคล็ดลับ


7
โปรดทราบว่าคุณต้องรวมคำตอบนี้กับคำตอบของ @ tobsen เพื่อให้ได้สิ่งที่ฉันขอ - xml ที่สะอาดจริงๆ!
Grzenio

14

คุณสามารถใช้XmlWriterSettingsและตั้งค่าคุณสมบัติOmitXmlDeclarationให้เป็นจริงตามที่อธิบายไว้ใน MSDN จากนั้นใช้XmlSerializer.Serialize (XmlWriter, objectToSerialize) ตามที่อธิบายไว้ที่นี่


0

สิ่งนี้จะเขียน XML ลงในไฟล์แทนสตริง Object ticket คือวัตถุที่ฉันทำให้เป็นอนุกรม

Namespaces ที่ใช้:

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

รหัส:

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); 
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.