0

仮定...

  • 複雑な XML スキーマがあり、他のスキーマ ファイルをインポート/インクルードし、さらに多くのスキーマ ファイルをインポート/インクルードします。
  • QName 型として宣言されている値 (つまり、テキスト ノード) を持つこの XML スキーマ内のすべての要素を検索したいと考えています。
  • これらの要素の場所 (パス) を XPath ステートメント (例: /foo/bar) として表現したいと考えています。

Java アプリケーションを作成している場合、この仕事に適したテクノロジは何ですか? XSOMのようなスキーマ オブジェクト モデルですか? それはJava XPath APIですか? 他の何か?

編集:SaxonでSCMにアクセスすることをすぐに開始したい人のために(以下のMichael Kayの推奨に従って)、ここにいくつかのJavaコードがあります(例外処理なし):

// Load the XSD into Saxon
Processor processor = new Processor(true);
SchemaManager schemaManager = processor.getSchemaManager(); 
DocumentBuilder documentBuilder = processor.newDocumentBuilder();
SAXSource saxSource = new SAXSource(new InputSource("path/to/yourSchema.xsd"));
XdmNode schema = documentBuilder.build(saxSource);
schemaManager.load(saxSource);
// Export the SCM
XdmDestination destination = new XdmDestination();
schemaManager.exportComponents(destination);
XdmNode xdmNode = destination.getXdmNode();
System.out.println(xdmNode.toString());
4

1 に答える 1

0

スキーマ ドキュメントのクエリを正しく実行するのは困難です。XSD では、同じことをさまざまな言い方で表現できるためです。たとえば、名前付きモデル グループと属性グループは、タスクをかなり複雑にします。

QName 自体だけでなく、QName から派生した型を探している場合は、非常に困難になります。

したがって、ある種の「コンパイル済み」スキーマで実行する方が、生のスキーマ ドキュメントで実行するよりもはるかに簡単です。

XSOM を使用することは 1 つの方法ですが、クエリ機能 IIRC はありません。もう 1 つのアプローチは、Saxon の SCM 出力を使用することです。これは、コンパイルされた「スキーマ コンポーネント モデル」を XML 形式で表現したものです。コンパイルされたスキーマであるため、xs:include、xs:redefine などのすべての複雑さを心配する必要はありません。一方、XML であるため、XQuery を使用できます。(ユーザー定義関数が必要な再帰結合を含め、多くの結合が関係するため、XPath ではなく XQuery をお勧めします。)

于 2012-03-19T15:23:46.417 に答える