xmlserializerがプレーンxmlのみをシリアル化するようにするにはどうすればよいですか?


86

からの最初の要素<?xml version="1.0" encoding="utf-16"?>xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"最初の要素を含まないプレーンなxmlを取得する必要がありXmlSerializerます。どうすればいいですか?

回答:


216

これをすべてまとめると、これは私にとって完璧に機能します:

    // 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を2回破棄しようとすると、コード分析でエラーが発生します。
Archna 2016年

1
@Archnaこれを行った場合、XmlWriter.Create呼び出しが例外をスローした場合、StringWriterは破棄されません。using( writer )この質問に見られるように、Disposeを2回実行しても2回目の呼び出しで何も行われないという保証に準拠しないIDispose実装を行う悪意のあるXmlWriter作成者を対象とする可能な解決策には、trycatchとストリームをnullに設定することが含まれます。stackoverflow.com/a/11192524/2144408
TamaMcGlinn

タイプパラメータTを何に使用していますか?
ジェスパー

25

XmlSerializer.Serializeカスタム名前空間を指定してそこに渡すことができるメソッドoverloadを使用します。

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

nullまたは空の配列を渡しても、トリックは実行されません


7
私が求めていたものを取得するには、この回答を@tobsenの回答と組み合わせる必要があることに注意してください-本当にクリーンなxmlです!
Grzenio 2009年


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); 
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.