使用Jsoup时如何获取元素的LineNumber?

问题描述 投票:0回答:3

如:

Document doc = Jsoup.parse(file,"UTF-8");

Elements eles = doc.getElementsByTag("style");

如何获取文件中

eles[0]
的行号?

java parsing jsoup element
3个回答
1
投票

你无法使用 Jsoup API 来做到这一点。我检查了他们的源代码:

org.jsoup.parser.Parser
不维护原始输入中元素的位置信息。

请参阅 Grep 代码上的来源

假设Jsoup是为提取和操作数据而构建的,我不相信它们将来会有这样的功能,因为操作后元素的位置是不明确的,并且维护实际引用的成本很高。


1
投票

没有直接的方法。但还有一个间接的方法。 一旦找到像属性这样的兴趣点,只需在元素前添加一个 html 标记,然后将该文件写入另一个临时文件。下一步是使用文本编辑工具搜索令牌。

代码如下。

第 1 步:

//获取一个元素
for (元素元素: doc.getAllElements()) {
...一些获取元素属性的代码...

String myAttr = attribute.getKey();
if (myAttr.equals("一些感兴趣的属性名称") {
System.out.println(attribute.getKey() + "::" + attribute.getValue());
元素之前(“”);
}

第 2 步:

// 将文档写回临时文件
// 请参阅:如何将 jsoup 文档另存为文本文件

步骤 3:

最后一步是使用文本编辑工具在输出文件中搜索“我的特殊令牌:ABCDEFG”。

jsoup 是一个不错的库。我认为这会帮助其他人。


0
投票

这对我使用 v1.18.34 有效。把它放在这里是因为这是我第一次开始寻找时的第一个谷歌结果。

    Document doc = Jsoup.parse(html, Parser.htmlParser().setTrackPosition(true));

    doc.body().children()
            .stream().filter(element -> element.tagName().equals("p") || element.tagName().startsWith("h"))
            .forEach(element -> {
                int lineNumber = element.sourceRange().start().lineNumber();
                System.out.println(element.tagName() + " @ Line number: " + lineNumber);
            });
© www.soinside.com 2019 - 2024. All rights reserved.