背景
System.Xml.Serialization.XmlSerializer
クラスのSerialize
メソッドで、何も指定せずにシリアライズすると、以下のようになります。
XML
<?xml version="1.0"?>
<outertag xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<innertag someattribute="...">
1行目のXML宣言や、一番外側の要素(2行目)の名前空間のプレフィックスの宣言など、無くてもいいものが付加されます。
要件としてこれらが必要ないので、除去したい!
XML宣言を付けずにシリアライズする
XmlWriterSettings.OmitXmlDeclaration
プロパティを使います。
-
XmlWriterSettings
クラスのインスタンスを作る -
OmitXmlDeclaration
プロパティをtrue
にする -
XmlWriter#Create
メソッドにXmlWriterSettings
クラスのインスタンスを渡して、XmlWriter
クラスのインスタンスを作る -
XmlSerializer.Serialize
メソッドにXmlWriter
クラスのインスタンスを渡す
C#
var serializer = new XmlSerializer(value.GetType());
var settings = new XmlWriterSettings // 1.
{
OmitXmlDeclaration = true, // 2.
};
using (var writer = XmlWriter.Create(stream, settings)) // 3.
{
serializer.Serialize(writer, value); // 4.
}
名前空間のプレフィックスの宣言を付けずにシリアライズする
XmlSerializerNamespaces
クラスのインスタンスを使い、プレフィックスと名前空間の組がないことを明示的に指定します。
-
XmlSerializerNamespaces
クラスのインスタンスを作る - 空のプレフィックスと空の名前空間の組を
Add
する(または、XmlQualified.Empty
を要素として持つXmlQualified
の配列を、XmlSerializerNamespaces
のコンストラクターに渡してもよい) -
XmlSerializer.Serialize
メソッドにXmlSerializerNamespaces
クラスのインスタンスを渡す
C#
var serializer = new XmlSerializer(value.GetType());
var emptyNamespaces = new XmlSerializerNamespaces(); // 1.
emptyNamespaces.Add(prefix: string.Empty, ns: string.Empty); // 2.
using (var writer = XmlWriter.Create(stream))
{
serializer.Serialize(writer, value, emptyNamespaces); // 3.
}
両方とも付けずにシリアライズする
それぞれ独立に働きますので、両方のコードを混ぜれば、両方が除去されます!
参考
How can I make the xmlserializer only serialize plain xml?
XmlWriterSettingsクラス
XmlSerializerNamespacesクラス
XmlSerializerクラス
XmlWriterクラス