LoginSignup
4

More than 5 years have passed since last update.

XmlSerializerでシリアライズするとき、XML宣言や名前空間のプレフィックス宣言を入れたくない!

Posted at

背景

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プロパティを使います。

  1. XmlWriterSettingsクラスのインスタンスを作る
  2. OmitXmlDeclarationプロパティをtrueにする
  3. XmlWriter#CreateメソッドにXmlWriterSettingsクラスのインスタンスを渡して、XmlWriterクラスのインスタンスを作る
  4. 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クラスのインスタンスを使い、プレフィックスと名前空間の組がないことを明示的に指定します。

  1. XmlSerializerNamespacesクラスのインスタンスを作る
  2. 空のプレフィックスと空の名前空間の組をAddする(または、XmlQualified.Emptyを要素として持つXmlQualifiedの配列を、XmlSerializerNamespacesのコンストラクターに渡してもよい)
  3. 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クラス

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4