Я не могу обещать, что это лучший способ, так как я раньше не использовал Jsoup, и я не эксперт по XML API.
Класс org.jsoup.Jsoup
имеет метод для анализа HTML в форме String
: Jsoup.parse(String)
. Это означает, что нам нужно получить HTML из WebView
как String
. Класс WebEngine
имеет свойство document
, которое содержит org.w3c.dom.Document
. Document
- это HTML-содержимое текущей веб-страницы. Нам просто нужно преобразовать Document
в String
, что мы можем сделать с Transformer
.
import java.io.StringWriter;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.jsoup.Jsoup;
public class Utils {
private static Transformer transformer;
// not thread safe
public static org.jsoup.nodes.Document convert(org.w3c.dom.Document doc)
throws TransformerException {
if (transformer == null) {
transformer = TransformerFactory.newDefaultInstance().newTransformer();
}
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(doc), new StreamResult(writer));
return Jsoup.parse(writer.toString());
}
}
Вы будете вызывать это каждый раз, когда изменяется свойство document
. Я провел несколько «тестов», просмотрев Google и напечатав org.jsoup.nodes.Document
на консоли, и все, что кажется работает.
Однако есть одна оговорка; Насколько я понимаю, свойство document
не меняется, когда происходят изменения на одной и той же веб-странице (однако сам Document
может быть обновлен). Я не сетевой человек, так что извините, если я не вижу здесь смысла, но я считаю, что это включает в себя такие вещи, как фрейм, изменяющий его содержание. Может быть способ обойти это путем взаимодействия с JavaScript с помощью WebEngine.executeStript(String)
, но я не знаю как.