Як я можу зробити xmlserializer лише серіалізацією звичайного xml?


85

Мені потрібно отримати звичайний 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. Як я можу це зробити?

Відповіді:


211

Якщо скласти все це разом - це мені ідеально підходить:

    // 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 нічого не робить для другого виклику, включає спробу catch і встановлення потоку для нуля всередині using( writer ), як це видно з цього питання: stackoverflow.com/a/11192524/2144408 .
TamaMcGlinn

Для чого ви використовуєте параметр типу T?
Jesper

25

Використовуйте XmlSerializer.Serializeметод перевантаження, де ви можете вказати власні простори імен і передати туди це.

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

передача нульового або порожнього масиву не зробить трюку


7
Зверніть увагу, що вам потрібно поєднати цю відповідь з відповіддю @ tobsen, щоб отримати те, про що я просив - справді чистий xml!
Грзеніо


0

Це запише XML у файл замість рядка. Квиток на об’єкт - це об’єкт, який я серіалізую.

Використовувані простори імен:

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); 
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.