用于从用户获取xpath输入的Design API

时间:2012-03-01 09:17:48

标签: java xml xpath

我想设计能够处理来自用户的XPATH输入的API。 目前我已按以下方式对XPATH输入进行建模,

public interface ICondition {
    String getConditionString();
}

public class XPathCondition implements ICondition {

    private Class<? extends XPATHFunction> clazz = null;

    private Operator operator = null;

    private String compValue = null;

    private String param = null;

    public void setXPathFunction(Class<? extends XPATHFunction> clazz) {
        this.clazz = clazz;
    }

    public void setComparisionType(Operator operator) {
        this.operator = operator;
    }

    public void setComparisionValue(String value) {
        this.compValue = value;
    }

    public void setParam(String param) {
        this.param = param;
    }

    public String getConditionString() {
        XPATHFunction function = null;
        try {
            function = (XPATHFunction) clazz.newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
        }
        return function.call(param) + operator.getOprValue() + compValue;
    }

    public static void main(String[] args) {
        XPathCondition xpathCond = new XPathCondition();
        xpathCond.setXPathFunction(CountFunction.class);
        xpathCond.setParam("/CPRRegistrationInfo/*");
        xpathCond.setComparisionType(Operator.GT);
        xpathCond.setComparisionValue("0");
        System.out.println(xpathCond.getConditionString());
    }
}


public interface XPATHFunction {

    public String call(String param);

}


public class CountFunction implements XPATHFunction {

    public String call(String param) {
        return "count(" + param + ") ";
    }

}

可能还有其他XPATH函数需要实现和接口XPATHFunction并以其方式实现它。

API只需要创建XPATHCondition并设置适当的函数并调用getConditionString()方法来获取最终的xpath。

有没有更好的方法,我们可以建模XPATH输入?

请帮助我重新考虑上述设计。

1 个答案:

答案 0 :(得分:0)

我认为我不能真正评论你的班级结构或提出不同的建议。这是一个非常棘手的问题。

我建议的是:

  • 从完整XPath语法的一些简单子集开始

  • 而不是从API的设计开始,类开始设计用户界面:您要向用户展示什么?他/她可能采取的行动是什么?然后,类设计应该来自UI设计。

  • 如果可能,请使用基础XML的架构,以便您可以向用户提供在表达式中使用的可能元素和属性名称的有限选择