FHIR プロジェクトによって提供されるスキーマから c# クラスを生成しようとし ています: http://hl7.org/implement/standards/fhir/ スキーマをダウンロードしました: http://hl7.org/documentcenter/public/standards/FHIR /fhir-all-xsd.zip zip ファイルを「ブロック解除」し、xsd ファイルをフォルダーに解凍しました。xsd.exe を使用して C# クラスを作成しようとすると、スキーマの問題を示すエラーが発生し続けます。一貫して取得するxhtml:div 要素は、他に加えて宣言されていません。ファイルfhir-all.xsdには、最上位のオブジェクトがリストされているようです。xsd.exe で動作する単純なスキーマtombstone.xsdを取得できましたが、 valueset.xsd や alert.xsdのようなより複雑な項目 惨めに失敗します。これらのファイルの何が問題なのかわかりません。これらのスキーマを修正する方法についてのヘルプをいただければ幸いです。
4 に答える
ただし、XSD から POCO を生成すると、最適とは言えないクラスが得られます。FHIR のシリアライゼーションでは多態性の使用が回避されるため、選択肢を提示する要素 (Observation.value など) は、XSD では同じ名前 (valueNumber、valueString、valueCodeableConcept など) を持つ要素のセットとして表されます。
同様に、json シリアライゼーションに同じ POCO を使用するのは非常に困難です。
FHIR 用の .NET NuGet パッケージには、FHIR リソース用に生成された一連のクラスが含まれています。さらに、コンテンツを検証するための検証属性があり、パッケージには、json と xsd のシリアライザーとパーサー、およびサーバーで残りの操作を呼び出すための REST クライアントが含まれています。
パーサーとシリアライザーを WebAPI と統合する必要がある場合は、それについてここに投稿しました: HL7 FHIR serialization to json in asp.net web api
まず、FHIR XSD ファイルが 2 つの同一の XML スキーマ セットを記述していることを理解する必要があります。 " 相互運用性の理由から、include
ディレクティブを使用しません。つまり、特定の名前空間を対象とするすべてのコンテンツが 1 つの XSD ファイルに入ります。
これらは 2 つのセットです。使用する必要があるのは 1 つだけです。詳細セット:
...そして「名前空間ごとの単一ファイル」のもの:
この投稿で説明したように、「1 つ」のセットを参照する必要があります。その投稿とは異なり、これらすべての XSD ファイルを折りたたむために別のツールは必要ありません。「単一の」セットが与えられます。
2 番目の図を上から下、左から右にたどるコマンド ラインを作成すると、未定義のコンテンツに関連するすべての問題を取り除くことができます。
ここで、循環グループ参照のサポートに関して、xsd.exe の制限と呼ばれるものに遭遇します。マイクロソフトはそうではないと言っています(少なくともこことここでは)。XSD 1.0仕様とXSD 1.1仕様の両方がそれを読んだ
循環グループはありません。つまり、グループの {particles} 内には、{term} がグループ自体である任意の深さの粒子はありません。
xsd.exe が使用する上記の解釈により、問題が発生します。xhtml1-strict.xsd ファイルには、「循環グループ」の依存関係がたくさんあります。xsd.exe を使用してこれらのエラーを回避することはできません。 ただし、そのファイルを修正するか (クライアントに対して 1 回実行しました)、FHIR ライブラリが HTML マークアップを処理するように見えるのと同じ行に沿って xhtml コンテンツへの参照を修正する必要があります。後者のアプローチは、混合コンテンツの性質のために HTML マークアップのコード バインディングを生成すべきではないという見解とより一致しており、すべてのコードで役に立たなくなります (少なくともラウンドトリップは不可能であり、テキスト ノードの正しい読み取りもありません)。 .NET のシリアライゼーションを含む、私が考えることができるバインディング テクノロジ。
@GrahameGrieve の 2 番目のコメントを考えると、.NET の組み込み XSD プロセッサが XHTML スキーマを正しく検証することを明示的に指摘する必要がありました。したがって、これは .NET XSD プロセッサの問題ではなく、xsd.exe が依存する .NET の他の部分の問題です (より具体的には、xsd.exe が行う外部呼び出し、XmlSchemaImporter.ImportTypeMappingが失敗します)。惨めに)
この種の混乱を避けるために、この種の混乱を避けるために、仕様が明確ではないことを非難します。
Petru のおかげで、コマンドは次のようになります。
循環参照が xhtml1-strict.xsd からコメントアウトされた後、クラスが作成されます
ただし、Ewout が指摘するように、これは完全な修正ではありません。スキーマ自体が POCO クラスに対して不親切になるように設計されているためです。
患者クラスでは、この要素:
<xs:choice minOccurs="0" maxOccurs="1" >
<xs:annotation>
<xs:documentation>Indicates if the individual is deceased or not.</xs:documentation>
</xs:annotation>
<xs:element name="deceasedBoolean" type="boolean"/>
<xs:element name="deceasedDateTime" type="dateTime"/>
</xs:choice>
収量:
/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute("deceasedBoolean", typeof(boolean))]
[System.Xml.Serialization.XmlElementAttribute("deceasedDateTime", typeof(dateTime))]
public Element Item {
get {
return this.itemField;
}
set {
this.itemField = value;
}
}
これらの調査結果は FHIR コメントで報告しており、対処されることを願っています。その間、私は当初の意図を進めることができます。これらの定義を使用した API の SOAP 実装。