1. ホーム
  2. c#

XSDコード生成器の比較【終了しました

2023-10-06 05:01:25

質問

私は、xsdスキーマファイルからのコード生成について研究しています。 私の要求

  • C# 2.0 コード (またはそれ以上) を生成する必要があり、必要に応じて汎用コレクションを使用します。
  • xsdコメントからコメントを生成しなければならない
  • 完全にシリアライズ可能なコードを生成しなければならない。
  • 同じインクルードを持つ複数の xsd から生成する場合、再利用可能な basetypes を生成できる必要がある。

(私の他の質問も参照してください。 どのように私は共通のインクルードを持つxsdから複数のクラスを生成することができますか? どのように私はwsdlのxs:documentationタグからコメントを生成することができますか?

私は以下のオプションを見つけました。

  1. xsd.exe を使用する (SDK および Visual Studio に付属しています)
  2. から XSDCodeGen を使用します。 Daniel Cazzulino
  3. Xsd2Code
  4. コードXS
  5. XsdObjectGen マイクロソフト社製
  6. XSDClassGen (動作していないようです)

何か見逃していたのでしょうか?なぜなら、(1), (2), (5) は 2.0 コードを生成せず、(3) からのコードのシリアライズで問題が発生するからです。コードを生成するときに何を使用しますか。

どのように解決するのですか?

私は XSD2Code は、現在 (2011年) 利用可能な最高のツールです。

私は最近、職場で利用可能なツールを分析する同じプロセスを経たので、次のことに関連する最新の回答を提供しようと思いました。 VS2010 .

私たちの主なドライバーは xsd.exe が XSD 注釈から XML 文書を生成しないことでした。これは、何百もの型定義があるため、私たちが望むことでした。 私は、上記のすべてのツールと同様に他のツールも試しましたが、ほとんどは非推奨、未メンテナンス、または VS2010 で利用できる xsd.exe の現在の機能性と一致することができませんでした。

Xsd2Code は素晴らしいツールで、活発にメンテナンスされているようです。 CodePlex のページには、さまざまなオプションが出力にどのように影響するかの素晴らしい例もあります。

また、コンテキスト メニューの統合やカスタム ビルド ツール (プロジェクトで XSD を参照し、カスタム ツールを指定すると、XSD を更新すると自動的にコードが更新される) など、VS と緊密に統合されています。 全体として、私たちは多くの作業を節約することができました。

私が見た他のツールの簡単な要約です。

  • Dingo - よりJavaに近いと思われる
  • XSDCodeGen - カスタムビルドツールの書き方のデモです。
  • コード XS - かなり良いツールですが、統合や機能が少なく、メンテナンスもされていません。
  • XSDObjectGen - メンテナンスが終了しており、現在の xsd.exe よりも機能が少ない。
  • XSDClassGen - 見つかりませんでした。
  • OXM ライブラリ - おすすめ このプロジェクトを見て、維持され、偉大な機能性
  • XSDへのLINQ - 非常に かっこいい プロジェクトですが、私が探していたものではありません。

追記です。 もしあなたがXSD2Codeで先に進むことを決めたなら、私がコマンドラインツールで作業して見つけた多くの問題があります。 特に、いくつかの引数処理にバグがあり、いくつかの引数が特定の順序にあることを必要とし、また、文書化されていない依存関係もあります (例 - 自動パラメーター & .NET バージョンは順序固有で依存性があります)。 以下は、私が XSD2Code を使用してコードを生成し、出力をクリーンアップするために使用した手順です - 必要に応じて、あなたに当てはまる部分を取ってください。

以下のバッチファイルを実行し、パスを正しい場所に変更して初期コードを生成します。

@echo off

set XsdPath=C:\schemas
set OutPath=%XsdPath%\Code
set ExePath=C:\Progra~1\Xsd2Code
set Namespace=InsertNamespaceHere

echo.Starting processing XSD files ...
for /f %%a IN ('dir %XsdPath%\*.xsd /a-d /b /s') do call:ProcessXsd %%a

echo.Finished processing XSD files ...
echo.&pause&
goto:eof

:ProcessXsd
%ExePath%\Xsd2Code %~1 %Namespace% %XsdPath%\Code\%~n1%.cs /pl Net35 /if- /dc /sc /eit
echo.Processed %~n1
goto:eof

必要に応じて、生成されたコードを整理するために次のステップを実行します。

  1. 正規表現による置き換え - 現在のプロジェクト、大文字、単語全体 [System.Runtime.Serialization.DataContractAttribute(名前:b*=:b*:q,:b 名前空間:b =:b*{:q})] with [DataContract(Namespace = \1)].
  2. 置換-現在のプロジェクト、ケース、単語全体-。 [System.Runtime.Serialization.DataMemberAttribute()]を参照してください。 [データメンバ]の
  3. 正規表現による置換 - 現在のプロジェクト、大文字、小文字、単語全体 System.Nullable \1\?
  4. 正規表現による置換 - オープンドキュメント、大文字小文字、単語全体-。 {:w}TYPE \1
  5. 置換 - オープンドキュメント、大文字、小文字、単語全体 システム.日付時刻 DateTime を追加し、足りないusing文は
  6. 置換 - オープンドキュメント、大文字小文字、単語全体 [System.Xml.Serialization.XmlIgnoreAttribute()] を参照してください。 [XmlIgnore] を使用します。
  7. 置き換え - 現在のプロジェクト System.Xml.Serialization.XmlArrayAttribute (システム.Xml.シリアライゼーション.XmlArrayアトリビュート) XmlArray
  8. 置き換え - 現在のプロジェクト System.Xml.Serialization.XmlArrayItemAttribute (システム.Xml.シリアライゼーション.XmlArrayアイテム属性) XmlArrayItem
  9. 正規表現による置換 - 現在のプロジェクト ,[:Wh]+/// \<remarks/> ,

誰かのお役に立てれば幸いです。