質問

この問題を解決する最良の方法を知りたい: xmlスキーマから空のテンプレートxmlを作成したいと思います。必要な要素と属性がすべて作成され、それらの値はすべて空の文字列になります。

次のステップは、特定のノードが持つことができる子xmlノードを決定する方法です。例えば。ノードにminOccurs =" 0"、maxOccurs =" unbounded"があることを選択します。その子の一人のために。その子、その属性、名前、値の種類などに関するすべてを決定できます。

状況に関するより多くのコンテキストを提供するために、ユーザーがより使いやすい設定でxmlファイルを編集できるツールを開発しています。たとえば、「account db」ノードに新しいアカウントを追加すると、利用可能な唯一のノードがアカウントノードであることがわかります。次に、子供がアカウントノードに追加しようとすると、名前ノード(必須)、パスワードノード(必須)、設定ノード(オプション)などが選択されます。アカウントノードが使用できる子をプログラムで決定する方法それと、それらの子の属性と設定は何ですか?

これは、C#2.0と.NET 2.0にあります。

要約すると、どのクラスを使用してスキーマを読み取って解析し、xmlの作成に役立つ情報を取得できますか?私は素直に、xsd自体がxmlだったので、横断できる何らかのDOMモデルがあることを期待していました。

これをプログラムに限定して、OxygenXml、VS、xsd.exeなどの外部ツールを使用しないようにします

役に立ちましたか?

解決

やりたいことは、ほとんどの優れたXMLエディターでXMLインテリセンスの背後にある機能を複製することです。すなわち、xmlスキーマを読み取り、次にどの要素と属性を取得できるかを判断します。

私たちは、少し前に取り組んだプロジェクトで非常に似たようなことをしました。ほとんどの場合に機能するものを作成することは多くの作業であり、常に機能するものを作成することは多くの作業です!

基本的には、XSDをロードする必要があります(.netのXmlSchemaオブジェクトを使用すると、これを実行できます)。しかし、それらが公開するSOMオブジェクトモデルは非常に生であるため、それを解釈するにはかなりの作業を行う必要があります。置換グループ、complexType拡張、カメレオンスキーマ、名前空間などの概念を無視する場合、SOMを簡単にナビゲートできるはずです。

次に、スキーマに関連してXMLドキュメント内のどこにいるかを把握する必要があります。 SOMにいることがわかったら、利用可能なオプションの解決を開始できます。

これを適切に行うには、1,000行のコードと4〜12人週の作業が必要です。数週間で基本的なものを一緒に入手できるかもしれませんか?

他のヒント

MSDNのドキュメントで目を光らせていましたが、香りがついたと思います。 XmlSchema.Readを使用してスキーマをロードし、コンパイルします。 Elementsプロパティには、「トップレベル」要素のコレクションが含まれます。ルート要素などの修飾名をハードコーディングする必要があります。それでおしまい。特定のスキーマ要素の下で「コンテンツ」を見つける方法はまだ見つかりません。

編集:あといくつかの方法を見つけましたが、まだ明確ではありません。 XmlSchemaElementsには、スキーマタイププロパティがあります。これは単純または複雑です。 XMLスキーマの複合型には、属性、シーケンス、グループなどを含めることができます。シーケンスには、要素となるパーティクルと呼ばれるプロパティがあります。そして、サイクルが繰り返されます。しかし、実装の難しい部分は、可能なすべてのケース(単純型、属性を持つ複合型、属性と要素を持つ複合型、拡張、シバン全体)を確実にカバーすることだと思います。

編集:XmlSchemaオブジェクトのElementプロパティを使用して、XmlSchemaElementを取得します。 XmlSchemaElementのSchemaTypeプロパティを使用して、単純型または複合型を取得します。 XmlSchemaComplexTypeのAttributeプロパティを使用して属性を取得するか、ContentModelを使用して「単純なコンテンツ」/「複雑なコンテンツ」を取得するか、Particleを使用して「シーケンス」/「選択」/「すべて」を取得します。基本的に、プロパティを下に移動して型をチェックし、オブジェクトを左右にキャストし、xsdオブジェクトの可能な配置をすべてチェックします。ライブラリを作成するには、長くて面倒でエラーが発生しやすくなります。そして、これはxmlスキーマを使用したものであり、dtdsを使用した場合、私も考え始めたくありません。うわー、xmlスキーマは必要ですが、なぜそんなに邪魔にならなければならないのですか。

XMLSPYなどのサードパーティツールを使用できます(リンク)。 xsdからダミーのxmlを作成するか、その逆を行います。

マシンに存在する.NETツールを使用して実行できる実際の(ただし無料の)方法は、xsd.exe( link )を使用して、以下を使用してスキーマが定義するエンティティオブジェクトを生成します。

xsd /classes /language:CS XSDSchemaFile.xsd

オブジェクトを取得したら、それらをプロジェクトにロードし、シリアル化します。ダミーデータを追加する場合は、プロパティなどを設定できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top