java - 使用 JXPath 查询列表

标签 java xpath jakarta-ee jxpath

我有一个简单的类(用于测试目的),我正尝试使用 JXPath 对其进行查询。

我创建了一个包含各种动物对象的列表,我想为以下对象获取一个迭代器:

  1. type='CAT' 的所有动物

  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] 工作。

最佳答案

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

/*[type='CAT']   

意思是“给我根节点,前提是它的属性类型等于 CAT”

我觉得你追求的更像是

/*/*[type='CAT']

读起来像“给我根节点正下方的节点,这些节点的属性类型等于 CAT”

布莱恩的建议

//*[type='CAT'] 

读起来像“给我树中任意位置具有等于 CAT 的属性类型的所有节点”

希望对您有所帮助。

关于java - 使用 JXPath 查询列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/898770/

相关文章:

java - 在 Javafx 中,从数据库填充 TableView 后按钮停止工作

java - 以编程方式获取 WebView 实现

python - 需要帮助使用 lxml 和 xpath 抓取 NHL 统计表

php - 使用正则表达式通过php过滤xpath中的属性

xpath - 如何通过 xmlXPathNodeEval() 将 XPath 限制为子树?

Java - 从内存中卸载媒体

java - 检查我的 Java RSA 算法

jakarta-ee - 让JavaEE Server记录事务信息

jsf - 使用 HttpServletRequest 和 LDAP 自动登录

java配置文件