2

私の問題は次のとおりです。Xpathクエリがたくさんあり、これらのクエリが解決する要素のタイプを取得できるようにしたいのですが、基礎となるxsd schemasを形成します。たとえば、スキーマが与えられた場合:

...
 <xs:complexType name="ResultType">
    <xs:sequence>
      <xs:element name="BUS" type="m:VectorType" />
      <xs:element name="VM" type="m:VectorType" />
      <xs:element name="VA" type="m:VectorType" />
      <xs:element name="QG" type="m:VectorType" />
    </xs:sequence>
  </xs:complexType>

  <xs:complexType name="VectorType">
    <xs:sequence>
      <xs:element name="Value" type="xs:double" minOccurs="1" maxOccurs="unbounded" />
    </xs:sequence>
  </xs:complexType>
...

そして、プログラムで(Javaコードから)//BUS/Value型が何であるかを確認できるようにしたいクエリ。//BUS/ValueApacheXMLSCHEMA や XSOM などを使用してスキーマを解析することはできますが、解析されたスキーマを取得すると、これらのライブラリのいずれも、上記のようなネストされた要素の型を直接取得する方法を提供しないようです。これを行う方法はありますか、または xpath クエリを BUS と Value に分割し、BUS のタイプを取得してから、その複雑なタイプで Value のタイプを検索する必要がありますか?

4

3 に答える 3

1

Java ライブラリには、あなたが望むことを直接行うものは何もないと思います。

XPath 式を解釈するのは大変な作業です。それらを解析してから、スキーマをナビゲートしながら解釈/実行する必要があります。非常に単純な XPath に限定しない限り、非常に複雑です。

考えられるより簡単な解決策は、次のようなスキーマから始まる「注釈付き」XML を構築するコードを記述することです。

<BUS myns:type="ResultType">
    <Value myns:type="VectorType">
      . . . 
    </Value>
 <BUS>

ここmynsで、別の名前空間のプレフィックスです。次に、この XML に対して XPath を実行しmyns:type、結果のノードの属性から型を取得します。

このサンプル XML をスキーマから生成すると、XPath を直接処理するよりも簡単になります。特に、スキーマを解析するクラスが既にある場合はなおさらです。

于 2012-08-14T14:39:06.277 に答える
1

XSOM は、スキーマ型を検索するための XPath にほぼ類似したスキーマ コンポーネント指定子(SCD) をサポートしています。少しわかりにくく、文書化が不十分であることがわかりましたが、まさにあなたが探しているものであるように思われます.

于 2012-08-15T15:47:39.580 に答える
0

上記の両方の回答は有効な解決策ですが、私が採用することにしたアプローチは、同僚から提案されたものでした。

特定のスキーマの各 xpath に対して:

  1. そのスキーマの完全なインスタンスを生成します (trang などのツールを使用すると簡単に実行できます)。完全とは、すべてのオプションの要素/属性が存在することを意味します。
  2. インスタンスを dom4j ドキュメントに解析し、そのインスタンスで xpath を使用してノードのリストを取得します。
  3. これらのノードのそれぞれについて、(スキーマ インスタンス ドキュメントのルートから) 絶対パスを取得します。
  4. いくつかのスキーマ解析ライブラリを使用してスキーマを解析します (私は XSOM を使用しています)
  5. 解析されたスキーマを再帰的にトラバースして、3 から各ノードのタイプを取得します (各ノードの絶対パスがあるので、これは簡単です)。

出来上がり!このXpathがスキーマインスタンスでバインドできる各ノードのタイプを抽出しましたが、スキーマ自体から抽出しました:)

于 2012-08-16T15:08:18.800 に答える