私は、ユーザーが独自の選択文字列を定義する機会を与えるプログラムに取り組んでいます。たとえば、式では次のようになります。
doc.select("a[href]");
ユーザーは「a[href]」部分を指定したことになります。私の質問は、渡された文字列が有効な JSoup セレクター文字列であるかどうかを確認するにはどうすればよいですか? これを検証する方法を知っている人はいますか?
どんな助けでも大歓迎です。
ありがとう
私は、ユーザーが独自の選択文字列を定義する機会を与えるプログラムに取り組んでいます。たとえば、式では次のようになります。
doc.select("a[href]");
ユーザーは「a[href]」部分を指定したことになります。私の質問は、渡された文字列が有効な JSoup セレクター文字列であるかどうかを確認するにはどうすればよいですか? これを検証する方法を知っている人はいますか?
どんな助けでも大歓迎です。
ありがとう
アプローチ1: Jsoupソースを編集してパーサーを公開するか、そこに独自のメソッドを実装します
アプローチ2:単純なダミー要素を解析し、例外をキャッチします。スローされた場合:クエリは無効です。それ以外の場合は問題ありません。最善の解決策ではありませんが、機能します。
次に例を示します。
private static final Element dummy = new Element(Tag.valueOf("p"), ""); // used for "testparsing"
// ...
public static boolean isValid(String query)
{
if( query == null ) // Check for null
return false;
try
{
Selector.select(query, dummy); // Use the querystring on the dummy - returnvalue is not relevant
}
catch( Selector.SelectorParseException | IllegalArgumentException ex ) // these exceptions are thrown if something is not ok
{
return false; // If something is not ok, the query is invalid
}
return true; // All ok, query is valid
}
テスト:
System.out.println(isValid(null)); // not valid
System.out.println(isValid("div.abc")); // valid
System.out.println(isValid("p[")); // not valid
System.out.println(isValid("a:matchesxy")); // not valid
System.out.println(isValid("div > a")); // valid
テスト結果:
false
true
false
false
true
jsoup ソースを確認します。セレクターを使用できます。Selector は公開されていない QueryParser を使用していますが、「チェック」することもできます。