C#でXMLファイルを読み書きする②

こんにちは、からすぱんです。

前回はXMLファイルの読み込み方法について記載しました。今回はシリアライズ(書き込み)について記載していきたいと思います。


XmlSerializerでXMLファイルを書き込む

前回同様、XmlSerializerクラスを用いてXMLファイルを書き込んでいきます。

出力結果とデータを格納するクラスオブジェクトは前回と同じものを使います。

<?xml version="1.0"?>
<XmlData Key="Test">
    <Name>name</Name>
    <Id>1</Id>
</XmlData>
/// <summary>
/// XMLに格納する1つのデータ要素を格納する
/// </summary>

public class XmlData
{

    /// <summary>
    /// Key属性
    /// </summary>
    [XmlAttribute("Key")]
    public string Key { get; set; }

    /// <summary>
    /// 名前要素
    /// </summary>
    public string Name { get; set; }

    /// <summary>
    /// ID要素
    /// </summary>
    public int Id { get; set; }
}

出力したい内容をデータ格納用クラスにセットし、シリアライズします。

string filePath = @"C:\sample.xml";

// データ格納用クラスに値をセット
XmlData data = new XmlData();
data.Key = "Test2";
data.Name = "なまえ";
data.Id = 2;

// シリアライズ
using (FileStream fs = new FileStream(filePath, FileMode.Create))
{
    XmlSerializer serializer = new XmlSerializer(typeof(XmlData));
    serializer.Serialize(fs, data);
}

シリアライズにはXmlSerializer.Serializeメソッドを使います。値をセットしたデータクラスをSerializeメソッドに渡しているだけです。

出力結果:

<?xml version="1.0"?>
<XmlData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Key="Test2">
    <Name>なまえ</Name>
    <Id>2</Id>
</XmlData>

なんだか変な文字列が余計に出力されました。

「xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance” xmlns:xsd=”http://www.w3.org/2001/XMLSchema”」これは、XML Schema のネームスペースです。

あっても特段問題はないのですが、この文字列のせいでKey属性が見づらくなってしまいました。

このネームスペース情報を出力させない方法があります。

XmlSerializer.Serializeメソッドのオーバロードメソッドを用いて、XmlSerializerNamespacesを渡すように修正します。

string filePath = @"C:\sample.xml";

// データ格納用クラスに値をセット
XmlData data = new XmlData();
data.Key = "Test2";
data.Name = "なまえ";
data.Id = 2;

// XmlSerializerNamespacesを生成し、空文字をセット
var namespaces = new XmlSerializerNamespaces();
namespaces.Add("", "");

// シリアライズ
using (FileStream fs = new FileStream(filePath, FileMode.Create))
{
    XmlSerializer serializer = new XmlSerializer(typeof(XmlData));

    // Serializeメソッドに、空文字をセットしたXmlSerializerNamespacesを渡す
    serializer.Serialize(fs, data, namespaces);
}

Serializeメソッドには他にもオーバーロードメソッドがあるので、違いを見てみるのも面白そうです。

出力結果:

<?xml version="1.0"?>
<XmlData Key="Test2">
    <Name>なまえ</Name>
    <Id>2</Id>
</XmlData>

無事余計なネームスペース情報が出力されなくなりました。


いかがだったでしょうか。

今回はシリアライズの方法について簡単に解説してみました。

次回こそはデータ格納用クラスのプロパティに指定するカテゴリ分けの詳細について解説していきたいと思います。