0

jsoup のメソッドを動的に呼び出したい。これが私のユースケースです。実際には、jsoup で複数の select dom メソッドを呼び出して、次のように内部をトラバースしています。

Document doc = Jsoup.connect("http://test.com").get();
String companyName = doc.select("div[class=\"_name\"]").select("span[class="\_name\"]").text();

同じことを動的に達成できますか、

Document doc = Jsoup.connect("http://test.com").get();
String pattern = "select("div[class=\"_name\"]").select("span[class="\_name\"]").text()";
String companyName = doc.pattern;

リフレクションを使用して達成できることはわかっていますが、パターン文字列が動的になり、n 個の dom セレクターを持つ可能性があるため、この動作を実装する方法がわかりません。

上記のダイナミズムが可能かどうか教えてください。

4

2 に答える 2

1

はい、可能です。select()すべてのセレクターを列挙し、メソッドを呼び出すまで、Document オブジェクトのメソッドを繰り返し呼び出すだけですtext()

すべてのセレクターを 1 つに連結することもselect(div[class=foo]).select(span[class=bar]).text()できselect(div[class=foo] span[class=bar]).text()ます。select(div.foo span.bar).text()

したがって、リフレクション全体を破棄して、必要なものへの正確で直接的なセレクターを動的に作成することもできます。

  Document doc = Jsoup.connect("http://test.com").get();
  String companyName = doc.select("div.foo span.bar").text();

これは連鎖を使用しています:

Document doc = Jsoup.connect("http://test.com").get();
List<String> criterias = Arrays.asList("div.foo", "span.bar");
Document tmpDoc = doc;
for (String criteria: criterias) {
    if (tmpDoc != null)
        tmpDoc = tmpDoc.select(criteria);
}
// now you have traversed the whole criterias just get the text
String companyName = tmpDoc.text();

それ以外の場合、これはリフレクションを使用しても同じです:

Document doc = Jsoup.connect("http://test.com").get();
List<String> criterias = Arrays.asList("div.foo", "span.bar");
Method select = doc.getClass().getMethod("select", String.class);
Document tmpDoc = doc;
for (String criteria: criterias) {
    if (tmpDoc != null)
        tmpDoc = (Document)select.invoke(tmpDoc, new Object[] {criteria});
}
// now you have traversed the whole criterias just get the text
String companyName = tmpDoc.text();
于 2012-08-31T15:23:03.673 に答える
0

n 個の dom セレクターをサポートすることだけが必要な場合は、単一のセレクター文字列でそれらを構成できるため、実際にはリフレクションは必要ありません。

Document doc = Jsoup.connect("http://test.com").get();
String pattern = "div[class=\"_name\"] span[class=\"_name\"]"; // Just separate with spaces
String companyName = doc.select(pattern).text();
于 2012-08-31T15:22:51.900 に答える