Как мне сделать так, чтобы XmlSerialiser не начинался с <?xml ?>?

StackOverflow https://stackoverflow.com/questions/1399657

  •  22-09-2019
  •  | 
  •  

Вопрос

Формат файла, с которым я работаю (OFX), является XML-подобным и содержит кучу обычного текста перед началом XML-подобного бита.Однако ему не нравится, когда есть разница между частями обычного текста и XML, поэтому мне интересно, есть ли способ заставить XmlSerialiser игнорировать это.Я знаю, что мог бы просмотреть файл и стереть эту строку, но было бы проще и чище вообще не записывать ее!Есть какие-нибудь идеи?

Это было полезно?

Решение

Не так уж сложно, вам просто нужно выполнить сериализацию в явно объявленном XmlWriter и установить параметры для этого writer перед сериализацией.

public static string SerializeExplicit(SomeObject obj)
{    
    XmlWriterSettings settings;
    settings = new XmlWriterSettings();
    settings.OmitXmlDeclaration = true;

    XmlSerializerNamespaces ns;
    ns = new XmlSerializerNamespaces();
    ns.Add("", "");


    XmlSerializer serializer;
    serializer = new XmlSerializer(typeof(SomeObject));

    //Or, you can pass a stream in to this function and serialize to it.
    // or a file, or whatever - this just returns the string for demo purposes.
    StringBuilder sb = new StringBuilder();
    using(var xwriter = XmlWriter.Create(sb, settings))
    {

        serializer.Serialize(xwriter, obj, ns);
        return sb.ToString();
    }
}

Другие советы

Вам придется манипулировать объектом XML writer, который вы используете при вызове Serialize способ.Его Settings свойство имеет OmitXmlDeclaration свойство, которому вы захотите присвоить значение true.Вам также нужно будет установить ConformanceLevel свойство, в противном случае XmlWriter будет игнорировать OmitXmlDeclaration собственность.

XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlWriter writer = XmlWriter.Create(/*whatever stream you need*/,settings);
serializer.Serialize(writer,objectToSerialize);
writer.close();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top