OverrideXml

皆さん~
C#XML を解析時、どんなシリアライザーを使いますか?
おそらく真っ先にXmlSerializer クラス (System.Xml.Serialization) にたどり着くでしょう。

だけど、XmlSerializerを使うと、
XmlElement クラス (System.Xml) とか
XmlAttribute クラス (System.Xml) とか
クラスやメンバーに属性を付ける必要があります。

場合によっては、クラスに編集を加えることができないし
いわゆる「非侵入型シリアライザー」がほしいです。

今年に面白い子「OverrideXML」 と出会いましたよ。
日本語の記事はほぼないので、ぜひ皆さんに紹介したいですね。

OverrideXML とは

XmlAttributeOverrides クラス (System.Xml.Serialization) を使うと、
XmlSerializer も非侵入型シリアライズができるんです。
が、サンプルを読んでも使い方はよくわからないですね
OverrideXML は XmlAttributeOverrides をとても使いやすくしてくれるクラスです。

OverrideXML の導入方法

方法1:nuget からインストール

NuGet Gallery | OverrideXml 1.0.0

方法2:GitHub からダウンロードして自分のプロジェクトに取り込む

github.com
ファイルは1つしかないのでとても手軽です。( Unity でも使えます )

OverrideXML の使い方

例えば以下のXMLファイルがあります
gist.github.com

上記XML データ構造によってクラスを定義します
gist.github.com

OverrideXml を使ってXmlAttributeOverrides を構築する
gist.github.com

もっと詳細に説明すると
OverrideXML はメソッドチェーンを使って記述していきます。

イメージしやすいように、
行毎にコメントを記載してみる

// まずは OverrideXml のインスタンスを作成して
new OverrideXml()
// class Table をオーバーライドし
.Override<Table>()
  // ルートタグを "table" 指定し
  .XmlRoot("table")
  // class Table のメンバー [border] を XmlAttribute [border] と紐付けます
  .Member("border").XmlAttribute("border")
  // class Table のメンバー [tr] を XmlElement [tr] と紐付けます
  .Member("tr").XmlElement("tr")
// class TR をオーバーライドし
.Override<TR>()
  // class TR のメンバー [td] を XmlElement [td] と紐付けます
  .Member("td").XmlElement("td")
// class TD をオーバーライドし
.Override<TD>()
  // class TD のメンバー [value] を XmlText と紐付けます
  .Member("value").XmlText()
// コミットしXmlAttributeOverrides を構築されます
.Commit();

最後はデシリアライズします。
gist.github.com

以上 OverrideXML の使い方でした。