如何通过org.w3c.dom.Element实现JavaFX WebView的inner/outer HTML读写
JavaFX WebView DOM操作获取/设置innerHTML的实现方案
方案1:调用内置实现(最简单)
JavaFX WebView返回的org.w3c.dom.Element实例实际运行时类型为com.sun.webkit.dom.HTMLElementImpl,该类原生提供innerHTML读写方法,直接强转即可调用:
import com.sun.webkit.dom.HTMLElementImpl; import org.w3c.dom.Element; // 示例:获取元素innerHTML Element target = htmlDocImpl.getElementById("test"); String content = ((HTMLElementImpl) target).getInnerHTML(); // 示例:设置元素innerHTML ((HTMLElementImpl) target).setInnerHTML("<span>自定义HTML内容</span>");
如果项目编译规则限制访问com.sun包下的类,改用反射调用即可:
// 反射获取innerHTML String content = (String) target.getClass().getMethod("getInnerHTML").invoke(target); // 反射设置innerHTML target.getClass().getMethod("setInnerHTML", String.class).invoke(target, "<span>自定义HTML内容</span>");
方案2:标准DOM API实现(无内部类依赖)
如果不想依赖平台内部实现,可通过W3C标准DOM接口完成相同需求:
读取innerHTML
import org.w3c.dom.Element; import org.w3c.dom.ranges.DocumentRange; import org.w3c.dom.ranges.Range; public String getInnerHTML(Element element) { DocumentRange docRange = (DocumentRange) element.getOwnerDocument(); Range range = docRange.createRange(); range.selectNodeContents(element); return range.toString(); }
设置innerHTML
import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.html.HTMLDocument; public void setInnerHTML(Element element, String htmlContent) { // 清空原有子节点 while (element.hasChildNodes()) { element.removeChild(element.getFirstChild()); } // 解析HTML片段并挂载 HTMLDocument doc = (HTMLDocument) element.getOwnerDocument(); Node fragment = null; try { // 反射调用createContextualFragment避免内部类依赖 fragment = (Node) doc.getClass().getMethod("createContextualFragment", String.class) .invoke(doc, htmlContent); } catch (Exception e) { e.printStackTrace(); } if (fragment != null) { element.appendChild(fragment); } }
内容的提问来源于stack exchange,提问作者Geoff L
相关产品推荐
相关产品推荐

