4

BaseDomain クラスを継承するいくつかのドメイン クラスがあります。

この BaseDomain クラスには、 public final String name; であるフィールドがあります。

name の値はコンストラクターで設定されます。

public class BaseDomain {
    public final String name;
    public BaseDomain() {
    this.name = this.getClass().getCanonicalName();
    }
}

この BaseDomain はいくつかのクラスによって拡張されています

public class Trip extends BaseDomain {
    private int id;
    public Trip(int id){
        this.id = id;
    }

}

ここまでは順調ですね。

JXPath を使用して、Trip のオブジェクト インスタンス内のフィールド「name」の値を取得したいのですが、取得できません。「id」フィールドにはアクセスできますが、「name」フィールドにはアクセスできません。

JXPathContext jxPathContext = JXPathContext.newContext(trip);
jxPathContext.setLenient(true);
int id = (int)jxPathContext.getValue("/@id"); // This works. 
String name = (String)jxPathContext.getValue("/@name"); // This does not work. 

この設定とJXPathで「name」の値を取得することは可能ですか?

コードに構文エラーやその他のエラーがある可能性があります。皆さんが私の質問を理解して理解してくれることを願っています。

ヘルプやポインタは大歓迎です。

最初に: ケリー S. フレンチの素早いリプレイに感謝したいと思います。もう少し説明しなければならないことに気づきました。

最終的にはより深い検索を行うため、jxpath を使用したいと考えています。例: Trip は、BaseDomain も拡張する Locations のリストを保持する場合があります。各 Location は、BaseDomain を拡張する PointOfInterest のリストを保持できます。

コードの他の部分のリフレクションを介して、タイプに基づいて BaseDomain のリストを取得できるようにしたい (class.getCanonicalName())

オブジェクト ツリーは xml に基づいておらず、純粋な POJO です。

私が理解している限り、タイプ、クラス名などに基づいてオブジェクトのリストを見つけるための jxpath-query を作成する方法はありません。

これは正しいです?誰かがそれを行う方法を知っていますか?

見苦しくても、最も簡単な方法は、スーパークラスにクラス名を保持するフィールドを用意することです。それが私がこの醜い解決策を行った理由です。

最終的に、トリップに基づいて、任意の深さで BaseDomain のインスタンスであるオブジェクトの反復子を返す jxpath-query を作成したいと思います。オブジェクトツリーのどのブランチにノードが配置されているかに依存しません。探しているオブジェクトのクラス名を取得します。

jxpath-queryでこれを達成できるかどうか知っている人はいますか?

コード例、ブログまたはその他のドキュメントへのリンクは大歓迎です。

以前のように、私はどんな助けにもとても感謝しています.

4

1 に答える 1

0

旅行のインスタンスがある場合、これができないのはなぜですか

 string n = trip.name;

旅行の XML 表現があることがわかりますが、XPath の使用は、「旅行」の XML しかない場合に適しています。

XPath を使用して名前を取得する必要がある場合は、生成された XML を投稿してください。name 属性は Trip の一部ではなく、それを囲む BaseDomain の一部であることに賭けても構わないと思います。jxPathContext を Trip に基づいている場合は、すでに BaseDomain のノードを渡しています。何らかの方法で (node.parent のように) 戻るか、コンテキストを作成するときにそれを行う必要があります。

// not sure about this approach
JXPathContext jxPathContext = JXPathContext.newContext(trip.super); 

親子関係に関するJXPath マニュアルを見た後、これを試してみませんか。

String name = (String)jxPathContext.getValue("/Trip/../@name");    
// or use "../@name", not sure it wouldn't need to be "/../@name"
于 2013-02-12T17:21:19.320 に答える