0

您好我正在尝试用 Jsoup 解析一大堆 html,但无法达到预期的目标。我正在从生成的 javadoc 中解析它,它缺乏 id 或其他有助于解析的元素。另一个问题是我必须在同一个文档中解析相同的标签,所以我不能严格定义选择。我设法做到了,但方法名称仍然存在问题,它位于 DOM 的另一个兄弟中。这是我的 html 和所需的解析结果:http: //img62.imageshack.us/img62/9870/08bz.png

我必须以某种方式“绑定”“pre”和“ol”标签(解析所需的 html 范围)。请帮我。

试图以这种方式做到这一点:Elements methodName = doc.select("pre:contains(public), dl > dd > ol"); 但这会给我带来太多的方法名称。

4

1 回答 1

1

如果我理解正确,您只public void method_name()需要解释该方法的作用的列表项,而不需要任何额外的 html 标记。

Elements methodName = doc.select("pre:contains(public), dl > dd > ol > li");

这将总共选择 4 个元素 - 方法名称和三个列表项,但它们周围仍然有 html 标签,例如<pre><li>。调用text()每个元素上的方法以删除这些标签:

for (Element e : methodName) {  
    System.out.println(e.text());
}

哪个输出:

11-08 10:47:19.468: I/System.out(816): public void test()
11-08 10:47:19.468: I/System.out(816): Navigates to app
11-08 10:47:19.468: I/System.out(816): opens main panel
11-08 10:47:19.478: I/System.out(816): starts it

由于缺少任何 id 属性,我认为不可能用一个 select 语句只选择相关的标签。因此,您可以遍历Elements您所做的选择并检查<pre>标签是否后跟标签(假设您使用我在第一个答案中<li>使用的相同语句)。doc.select()

例子:

Elements methodName = doc.select("pre:contains(public), dl > dd > ol > li");

for (int i = 0; i < methodName.size(); i++) {
    if (methodName.get(i).tagName().equals("pre")) {        // if the <pre> tag
        if (methodName.get(i + 1).tagName().equals("li")) { // is followed by a <li> tag
            System.out.println(methodName.get(i).text());   // print it
        }
    } else System.out.println(methodName.get(i).text());    // else it is a <li> tag so print it
}  

这将提供与我的第一个示例相同的输出,即使有另外两个<pre>带有 methodNames 的标签没有<ol>后面的列表(正如您在评论中提到的那样)。

注意:根据您的文档格式,您可能需要注意IndexOutOfBoundsException(当我调用时i + 1),但您可以为此添加另一个检查。

于 2013-11-08T00:52:09.110 回答