_嗨,这是我的网页:
text of first span
text of second span
我正在使用jsoup来解析它,然后浏览页面内的所有元素并获取它们的路径:
Document doc = Jsoup.parse(new File("C:\\Users\\HC\\Desktop\\dataset\\index.html"), "UTF-8");
Elements elements = doc.body().select("*");
ArrayList all = new ArrayList();
for (Element element : elements) {
if (!element.ownText().isEmpty()) {
StringBuilder path = new StringBuilder(element.nodeName());
String value = element.ownText();
Elements p_el = element.parents();
for (Element el : p_el) {
path.insert(0, el.nodeName() + '/');
}
all.add(path + " = " + value + "\n");
System.out.println(path +" = "+ value);
}
}
return all;
我的代码给了我这个结果:
html/body/div = text div 1
html/body/div/span = text of first span
html/body/div/span = text of second span
html/body/div = text div 3
事实上我想得到这样的结果:
html/body/div[1] = text div 1
html/body/div[2]/span[1] = text of first span
html/body/div[2]/span[2] = text of second span
html/body/div[3] = text div 3
请任何人可以告诉我如何达到这个结果:).提前致谢.
解决方法:
正如这里提出的一个想法.
即使我非常确定有更好的解决方案来获取给定节点的xpath.例如,使用xslt,如answer中的“从XML节点java生成/获取xpath”.
这是基于您当前尝试的可能解决方案.
对于每个(父)元素,检查是否有多个具有此名称的元素.
伪代码:if(count(el.select(‘../’el.nodeName())> 1)
如果为true,则使用相同的名称计算previous-sibling ::并添加1.
count(el.select(‘preceding-sibling ::’el.nodeName())1
标签:java,dom,xpath,jsoup,html
来源: https://codeday.me/bug/20190623/1269683.html