Как я могу сделать так, чтобы xmlserializer сериализовал только простой xml?

Мне нужно получить простой 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. Как мне это сделать?


person Grzenio    schedule 20.11.2009    source источник


Ответы (4)


Чтобы собрать все это вместе - у меня это отлично работает:

    // 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();
        }
    }
person Simon Sanderson    schedule 17.09.2010
comment
using (var stream = new StringWriter ()) можно изменить на var stream = new StringWriter (); Выдает ошибку при анализе кода, поскольку пытается дважды удалить xmlwriter. - person Archna; 04.11.2016
comment
@Archna Если вы это сделаете, StringWriter не будет удален в случае, если вызов XmlWriter.Create вызывает исключение. Возможное решение, охватывающее вредоносных авторов XmlWriter, создающих реализацию IDispose, которая не соответствует гарантии того, что выполнение Dispose дважды ничего не делает для второго вызова, будет включать в себя попытку перехвата и установку потока на null внутри using( writer ), как можно увидеть в этом вопросе : stackoverflow.com/a/11192524/2144408. - person TamaMcGlinn; 18.10.2018
comment
Для чего вы используете параметр типа T? - person Jesper; 11.12.2019

Используйте перегрузку метода XmlSerializer.Serialize, где вы можете указать пользовательские пространства имен и передать туда this.

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

передача нулевого или пустого массива не поможет

person kossib    schedule 22.11.2009
comment
Обратите внимание, что вам нужно объединить этот ответ с ответом @tobsen, чтобы получить то, о чем я просил - действительно чистый xml! - person Grzenio; 23.11.2009

Вы можете использовать XmlWriterSettings и установить для свойства OmitXmlDeclaration значение true как описано в msdn. Затем используйте XmlSerializer.Serialize (xmlWriter, objectToSerialize) , как описано здесь.

person tobsen    schedule 20.11.2009

Это запишет 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); 
}
person Keith Aymar    schedule 15.07.2019