[英]Using Jsoup with Java Reflection
我想动态调用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选择器。
让我知道上述动力是否可行。
是的,有可能,您要做的就是重复调用Document对象上的select()
方法,直到枚举了所有选择器,然后再调用text()
方法。
您甚至可以合并所有选择器,因为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();
如果您只想支持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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.