フラットな XSD を使用しているため、XML でデータを保存する代わりに、データが非常に巨大になる可能性があるため、CSV 形式で保存することを考えています。XSD から CSV の各レコードの Element Type を知っていると仮定すると、Java ベースの XML Validator を使用して XSD に対して CSV の各レコードを検証する方法はありますか?
3 に答える
Saxon XSD バリデーターは SAX フィルターとして機能するため、入力の XML ビューを表す SAX イベントを送信することで検証を行うことができます。したがって、必要なのは、CSV ファイルを読み取り、そのコンテンツを表す SAX イベントを発行する Java プログラムだけです。SAX イベントは XSD バリデーターにパイプされます。
「フラットな XSD」と「各レコードの要素タイプ」とはどういう意味ですか? 明らかに、XML 入力を期待するバリデーターに非 XML 形式を供給する際に、なんらかの変換または適応プロセスが関与します。したがって、関連するすべての名前が使用可能である必要があります。
特に、追加の列 (通常は行の先頭) がない限り、行全体に対応する要素の名前をエンコードする余地はありません。これは、最初の行の他の列の名前が子要素 (上位) であるか属性 (下位) であるかに関係ありません。
次に、この名前がアダプターで使用可能であると仮定すると、「フラット XSD」はどのように見えるでしょうか? この要素がスキーマのルートまたは最上位要素である場合 (つまり、スキーマが 1 つの行のみを記述している場合)、一連の行のコンテナーとして機能する新しい最上位要素でスキーマを拡張する必要があります。あなたのCSVファイルは何ですか。つまり、各行を個別の XML ドキュメントとして検証するのではなく、CSV ファイル全体を変換または適合させて、単一の XML ドキュメントとして検証する必要があります。
バリデーターがパイプ入力を受け取ることができる場合は、便利なスクリプト言語で記述された CSV から XML へのコンバーターがあれば十分です。
それを行う1つの方法は、次のことを行うことです。
- JAXB コンパイラを使用して、XSD から Java クラスを作成する
- Flatwormに似た製品を使用して、レコード (またはファイル全体) を上記で作成した Java クラスに自動的/宣言的に解析するか、単に手動で解析します。
- ここ SOに投稿されているようなアプローチを使用して、グラフを検証します。適切にキャッシュするようにしてください。つまり、バリデーターと JAXBContext オブジェクトを再利用してください。
要求の性質を考えると、たとえ JAXBSource であっても、XML へのマーシャリングによって発生するオーバーヘッドは避けられません。あなたができることはそれを最大限に活用することです... CPU帯域幅が問題にならない場合は、スループットを向上させるために並列化を試みることができます(スレッドごとに1つのバリデーターが必要になります.JAXBContentは前回使用したときにスレッドセーフでした. )。そして、すべてのレコードの XSD (レコードに一致する要素が maxOccurs="unbounded" のパーティクルになるように) がより効率的な検証方法であると考えている場合は、ファイル全体をロードすることは避けます...大きなファイルの場合、おそらくメモリ不足になります...
大量のデータの場合、XSD の使用は洗練されていると言えますが、それほど効率的ではありません。.NET ソリューションを探しているときにこの投稿に出くわした人にとっては、代わりにXmlSchemaDatatype.ParseValueへの呼び出しを行うことで、個々のフィールドを検証する方がはるかに効率的です (XSD にフィールド間の制約などがないことを前提としています) 。