2019年11月28日木曜日

Xsd.exeでXMLからC#モデルクラスを生成さす

あまプロではC#の案件をお請けする事が有ります。
先日、XMLファイルからC#のモデルクラスを生成するXSDというツールでハマったのであメログ。

.net frameworkにはXMLファイルからC#のモデルクラスを生成してくれるXsd.exeという
ツールが予めインストールされてます。
※見付からない人はドットネットのインストールディレクトリを検索してみてね

このツールでXMLからC#のクラスファイルを生成する事が出来ます。
手順
  1. xsd hoge.xml
    これでスキーマファイル(hoge.xsd)がカレントディレクトリに生成されます
  2. xsd /c hoge.xsd /n:namespace.hoge
    これでC#のカレントディレクトリにクラスファイルが生成されます
二段階あるのでちょっと手間ですけど、多数のXMLファイルからC#クラスを生成せなあかん場合はバッチファイルとかを組むと良いでしょう。

これはこれで便利やねんけど、例えば
hoge.xml
<?xml version="1.0" encoding="utf-8"?>
<root>
  <child0>value0</child0>
  <child1>value1</child1>
  <child2>value2</child2>
</root>
こんなXMLファイルやと生成されるC#クラス内に
NewDataSetという内部クラスが生成されてしまいます。

C#クラス一つだけなら問題なくコンパイルも通んねんけど
生成されたクラスが二つ以上同じネームスペース内に有ると
重複エラーでコンパイルが通らんくなってしまいます…。

ツールの引数を色々変えて試してみたけど、あかんくて結局
hoge.xml
<?xml version="1.0" encoding="utf-8"?>
<root>
  <child>
    <child0>value0</child0>
    <child1>value1</child1>
    <child2>value2</child2>
  </child>
</root>
こんな感じに要素を一つ追加して回避しました。
こうするとNewDataSetという内部クラスは生成されず、重複エラーも起きない。

その他の回避策としてはクラス毎にネームスペースを変えるとかかな…美しくないけど。

ツールの仕様らしいです〜。

0 件のコメント:

コメントを投稿

つっこみ