Класс для легкой генерации xpaths - PullRequest
1 голос
/ 16 февраля 2020

Я хотел бы написать класс для генерации xpaths. В классе должно быть 2 метода: down(String string) и child(String string).

Я бы хотел использовать этот класс следующим образом:

XpathBuilder.child("div").down("button").child("a").child("span")

//That should return a String: div//button/a/span

Может кто-нибудь подсказать, как мне это сделать?

Ответы [ 2 ]

1 голос
/ 16 февраля 2020

Вы можете взглянуть на шаблон компоновщика.

Вот один пример (использует внутренний класс компоновщика):

public class XpathBuilder {

    public Builder builder() {
        return new XpathBuilder.Builder();
    }

    class Builder {

        private final StringBuilder sb;

        Builder() {
            sb = new StringBuilder();
        }

        public Builder child(String name) {
            sb.append("/").append(name);
            return this;
        }

        public Builder down(String name) {
            sb.append("//").append(name);
            return this;
        }

        public String build() {
            return sb.toString();
        }
    }
}

Его можно назвать так:

String path = new XpathBuilder().builder().child("div").down("button").child("a").child("span").build();

Вот еще один пример (использует компоновщик и шаблон синглтона):

public class XpathBuilder {

    private final StringBuilder sb;

    private static XpathBuilder instance;

    private XpathBuilder() {
        sb = new StringBuilder();
    }

    public static XpathBuilder newInstance() {
        if (instance == null) {
            instance = new XpathBuilder();
        }
        return instance;
    }

    public XpathBuilder child(String name) {
        sb.append("/").append(name);
        return this;
    }

    public XpathBuilder down(String name) {
        sb.append("//").append(name);
        return this;
    }

    public String build() {
        return sb.toString();
    }

}

Его можно назвать так:

String path = XpathBuilder.newInstance().child("div").down("button").child("a").child("span").build();
0 голосов
/ 24 февраля 2020

Мне кажется, я нашел более простое решение, переопределяющее метод toString из класса Object. Для этого мне нужен только один класс:

public class XpathBuilder {

StringBuilder sb = new StringBuilder();

public XpathBuilder child(String string) {
    sb.append("/"+string);
    return this;
}

public XpathBuilder down(String string){
    sb.append("//"+string);
    return this;
}

@Override
public String toString(){
    return sb.toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...