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 からインストール
方法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 の使い方でした。