首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用JXPath查询列表

使用JXPath查询列表
EN

Stack Overflow用户
提问于 2009-05-22 16:32:21
回答 2查看 3.6K关注 0票数 3

我有一个简单的类(用于测试目的),我试图使用JXPath查询它。

我创建了各种动物对象的列表,并且我想获得一个Iterator用于:

所有动物类型=‘猫’

  1. numLegs = 4

的所有动物

下面是一个简单的类:

代码语言:javascript
复制
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;
    }

}

下面是我用来构建一个动物列表以供我查询的方法:

代码语言:javascript
复制
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;
}

下面是我试图执行查询的方式:

代码语言:javascript
复制
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());
}

本部分:

代码语言:javascript
复制
    Iterator<BeanPointer> iter = 
        animsContext.iteratePointers("/*[type='CAT']");

不起作用。我做错了什么?我也不能让它为/*numLegs=4工作。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-05-29 06:31:42

我从未使用过JXPath,但我希望有一个根节点,在这种情况下

代码语言:javascript
复制
/*[type='CAT']   

将意味着“只有当根节点的属性类型等于CAT时,才给我根节点”。

我觉得你想要的更像是

代码语言:javascript
复制
/*/*[type='CAT']

它将读为“将属性类型与CAT相等的根节点直接提供给我”。

布赖恩的建议

代码语言:javascript
复制
//*[type='CAT'] 

如下所示:“给树中所有具有与CAT相等的属性类型的节点”。

希望这能帮点忙。

票数 5
EN

Stack Overflow用户

发布于 2009-05-22 17:10:15

我不知道上面有什么不管用的。不过,有几点。

  1. 我不确定枚举是否如您所期望的那样工作。您的JXPath查询正在查询一种类型,其中getType()将返回枚举而不是字符串。我不知道JXPath是不是那么聪明。enumerations.
  2. [type='CAT']本身并不是一个XPath表达式。我希望像//*[type='CAT']

这样的东西

因此,我将尝试以下几点:

  1. 实现了一个getTypeName()方法,该方法返回枚举名,例如CAT/
  2. 等,并使用
  3. 尝试//*的XPath (没有任何谓词)以确认JXpath将按预期查询ArrayList。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/898770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档