如何查找HTML属性中嵌套的自定义元素?
解决Jsoup无法查找属性内嵌套元素的问题
这问题我之前也碰到过!核心原因是你要找的<custom:test>并不是真正的DOM元素——它只是input按钮value属性里的一段文本内容,Jsoup解析原始HTML后,只会把它当作字符串存在属性里,不会把它解析成独立的节点,所以用常规的元素选择器自然找不到。
下面是具体的解决步骤:
步骤1:提取目标属性的内容
首先需要先定位到包含目标文本的input元素,然后取出它的value属性值:
String input = readFileAsString(filePath); Document doc = Jsoup.parse(input); // 找到对应的input按钮 Element inputButton = doc.selectFirst("input[type=button]"); // 获取value属性里的内容 String nestedContent = inputButton.attr("value");
步骤2:把属性内容当作独立的HTML/XML解析
接下来,把提取到的nestedContent当作一段新的HTML(或XML)内容,用Jsoup重新解析,这样里面的<custom:test>就会被识别成DOM元素了:
// 用XML解析器处理更适合这种自定义标签场景 Document innerDoc = Jsoup.parse(nestedContent, "", Parser.xmlParser()); // 现在就可以正常查找custom:test元素了 Elements messageEls = innerDoc.select("custom|test");
步骤3:验证结果并获取属性值
最后可以检查是否找到元素,并提取它的属性:
if (!messageEls.isEmpty()) { String codeAttr = messageEls.first().attr("code"); System.out.println(codeAttr); // 会输出"key" }
备选方案:如果命名空间选择器不生效
如果遇到命名空间相关的问题,也可以直接通过标签名来筛选:
Elements messageEls = innerDoc.select("*").stream() .filter(element -> element.tagName().equals("custom:test")) .collect(Collectors.toCollection(Elements::new));
内容的提问来源于stack exchange,提问作者emilly
相关产品推荐
相关产品推荐

