HtmlUnit技术问询:如何判断HtmlElement是否为HtmlAnchor?
判断HtmlElement是否为HtmlAnchor类型的优雅方式
我现在有一个HtmlElement对象,它可能是表格、单元格或者锚链接等不同类型的元素。我需要判断它是不是HtmlAnchor类型,但目前用的是强制转换加捕获ClassCastException的方式,不仅不优雅,还会出现未使用变量的问题,不符合编码规范。
我的现有代码是这样的:
final HtmlElement htmlElement = htmlPage.getFirstByXPath(String.format("//*[text()='%s']", "textName")); try { HtmlAnchor anchorLink = (HtmlAnchor) htmlElement; System.out.println("HtmlElement is an anchor link!"); } catch (ClassCastException e) { System.out.println("HtmlElement is not an anchor link!"); }
有没有更规范、优雅的方法来做这个判断呢?
你完全可以用Java的instanceof关键字来做这个判断,这是类型检查的标准方式,比try-catch的方式更清晰高效,也不会有未使用变量的问题:
final HtmlElement htmlElement = htmlPage.getFirstByXPath(String.format("//*[text()='%s']", "textName")); if (htmlElement instanceof HtmlAnchor) { System.out.println("HtmlElement is an anchor link!"); // 如果之后需要使用这个锚链接对象,直接在这里转换即可 HtmlAnchor anchorLink = (HtmlAnchor) htmlElement; // 比如获取链接地址:anchorLink.getHrefAttribute() } else { System.out.println("HtmlElement is not an anchor link!"); }
另外,如果你用的是Jsoup这类常见的HTML解析库(从代码里的HtmlElement和HtmlAnchor来看大概率是),还可以通过检查元素的标签名来辅助判断:
if ("a".equalsIgnoreCase(htmlElement.getTagName())) { // 这也能识别锚链接,但instanceof的方式更直接对应类型体系 }
instanceof的好处在于它是编译时检查的一部分,能明确表达你的类型判断意图,还避免了异常捕获带来的不必要性能开销(哪怕这里开销很小,但从编码规范来说更优)。只有当你百分百确定类型匹配时,才应该直接强制转换,否则优先用instanceof做前置检查。
内容的提问来源于stack exchange,提问作者firstpostcommenter
相关产品推荐
相关产品推荐

