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

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

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

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

косиб
источник
7
Обратите внимание, что вам нужно объединить этот ответ с ответом @tobsen, чтобы получить то, о чем я просил - действительно чистый xml!
Grzenio
14

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

Tobsen
источник
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); 
}
Кейт Аймар
источник