2009-05-22 104 views
2

我有一個簡單的類(用於測試目的),我試圖使用JXPath進行查詢。使用JXPath查詢列表

我創造各種動物對象的列表,我想獲得一個Iterator爲:

  1. 所有的動物,其中類型= '貓'

  2. 所有的動物在那裏numLegs = 4

這裏是簡單的類:

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; 
    } 

} 

這裏是我使用建立動物名單,我對查詢方法:

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'] 

將意味着「給我根節點,只有同時具備的屬性鍵入等於CAT「

我覺得你是什麼東西后更像

/*/*[type='CAT'] 

其內容,如」給我直接節點undern eath有一個屬性類型等於CAT」

Brian的建議

//*[type='CAT'] 

讀起來就像‘根節點給我的所有節點的任何地方有一個屬性類型等於CAT’樹

希望能有所幫助。

2

我不確定上面沒有工作。但是有幾點。

  1. 我不確定枚舉是否按預期工作。您的JXPath查詢正在查詢getType()將返回枚舉而不是字符串的類型。我不確定JXPath是否聰明。枚舉。
  2. [type='CAT']本身不是XPath表達式。我希望像//*[type='CAT']

所以我會嘗試以下方法:

  1. 實現該例如返回枚舉名getTypeName()方法CAT/DOG等,並使用該查詢
  2. 嘗試使用XPath //*(沒有任何謂詞)來確認JXpath將按預期方式查詢ArrayList。