2009-05-22 103 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。