Как я могу сделать так, чтобы 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


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.