2009-05-22 10 views
2

JXPathを使用して照会しようとしている単純なクラス(テスト目的用)があります。JXPathを使用したリストの照会

私は様々な動物オブジェクトのリストを作成し、私はイテレータを取得したい:numLegs = 4

すべての動物すべての動物の種類は= 'CAT'

    1. ここで

    は、単純なクラスです:

    public class Animal { 
    
        private UUID uuid; 
        private int numLegs; 
        private AnimalType type; 
    
        public enum AnimalType { 
         CHICKEN, FROG, DOG, CAT 
        } 
    
        public Animal(AnimalType type) { 
         this.type = type; 
         uuid = UUID.randomUUID(); 
         switch (type) { 
         case CHICKEN: 
          numLegs = 2; 
          break; 
         case FROG: 
          numLegs = 2; 
          break; 
         case DOG: 
          numLegs = 4; 
          break; 
         case CAT: 
          numLegs = 4; 
          break; 
         } 
        } 
    
        public UUID getUuid() { 
         return uuid; 
        } 
    
        public int getNumLegs() { 
         return numLegs; 
        } 
    
        public AnimalType getType() { 
         return type; 
        } 
    
        public String toString(){ 
         return "UUID: "+uuid+", Animal: "+type+ ", Legs: "+numLegs; 
        } 
    
    } 
    
    0ここで

    私は私がに対する照会するために動物のリストを構築するために使用しています方法であって、ここで

    private static List<Animal> getAnimals(int numAnimals) { 
        ArrayList<Animal> animals = new ArrayList<Animal>(); 
        for(int i = 0; i<numAnimals; i++){ 
         if(i%4==0){ 
          animals.add(new Animal(AnimalType.CAT)); 
         } 
         else if(i%3==0){ 
          animals.add(new Animal(AnimalType.DOG)); 
         } 
         else if(i%2==0){ 
          animals.add(new Animal(AnimalType.FROG)); 
         } 
         else{ 
          animals.add(new Animal(AnimalType.CHICKEN)); 
         } 
    
        } 
    
        return animals; 
    } 
    

    は、私は、クエリを実行しようとしている方法です:

    public static void main(String[] args){ 
        List<Animal> animals = getAnimals(10000); 
    
        JXPathContext animsContext = JXPathContext.newContext(animals); 
    
        Iterator<BeanPointer> iter = 
         animsContext.iteratePointers("/*[type='CAT']"); 
    
        List<Animal> cats = new ArrayList<Animal>(); 
    
    
        while(iter.hasNext()){ 
         cats.add((Animal) iter.next().getParent().getValue()); 
        } 
        System.out.println("Number of Cats is: "+cats.size()); 
    } 
    

    この部分:

    Iterator<BeanPointer> iter = 
         animsContext.iteratePointers("/*[type='CAT']"); 
    

    は機能しません。私は間違って何をしていますか?私はそれを/ * [numLegs = 4]のどちらかで働かせることはできません。

  • 答えて

    5

    私はJXPathはを使用したことがありませんが、私は

    /*[type='CAT'] 
    

    は、それがの属性を持っている場合にのみ、私のルートノードを与える」という意味と思われる場合には、ルートノード、があると期待されます私を与える直接undernノード「の後のように読んでいましたより

    /*/*[type='CAT'] 
    

    のようなものがある

    は、私はあなたが何であるかだと思う」CATに等しい入力CAT」

    //*[type='CAT'] 
    

    は次のように読み込み

    ブライアンの提案 『に等しい属性タイプを持つルートノードをeath』 CATに等しい属性タイプを持つツリー内のどこにでも私のすべてのノードを与えます

    ほんの少し役に立ちます。

    2

    私は上記でうまくいかないのか分かりません。しかし、いくつかの点。

    1. 期待通りに列挙型が機能しているかどうかはわかりません。あなたのJXPathクエリは、getType()が列挙ではなく文字列を返す型のクエリを実行しています。私はJXPathが賢いwrtかどうかはわかりません。列挙。それ自体で
    2. [type='CAT']は、XPath式ではありません。

      1. 例えば、列挙名を返しますgetTypeNameメソッド()メソッドを実装します。私は、だから私は、次のことをしようと//*[type='CAT']

      のようなものを期待しますCAT/DOGなどとクエリ使用して

    3. ということは予想通りJXPathははArrayListのを照会することを確認するために(任意の述語なし)//*のXPathを試してみてください。
    関連する問題