1

我正在尝试使用 dom4j 来解析 xhtml 文档。如果我只是打印出文档,我可以看到整个文档,因此我知道它被正确加载。我试图选择的两个 div 在文档中处于完全相同的级别。

html
  body
    div
     table
      tbody
       tr
        td
         table
           tbody
            tr
             td
              div class="definition"
              div class="example"

我的代码是

List<Element> list = document.selectNodes("//html/body/div/table/tbody/tr/td/table/tbody/tr/td");

但是当我这样做时列表是空的 System.out.println(list);

如果我只这样做List<Element> list = document.selectNodes("//html");,它实际上会返回一个包含一个元素的列表。所以我对我的 xpath 出了什么问题以及为什么它找不到那些 div 感到困惑

4

3 回答 3

3

尝试将 xhtml 命名空间声明到 xpath,例如将其绑定到前缀x//x:html/x:body...用作 XPath 表达式(另请参阅这篇文章,但它适用于 Groovy,而不适用于纯 Java)。可能类似于以下内容应该在 Java 中执行:

DefaultXPath xpath = new DefaultXPath("//x:html/x:body/...");
Map<String,String> namespaces = new TreeMap<String,String>();
namespaces.put("x","http://www.w3.org/1999/xhtml");
xpath.setNamespaceURIs(namespaces);

list = xpath.selectNodes(document);

(未经测试)

于 2010-09-01T21:06:25.217 回答
1

只是“//div”呢?还是“//html/body/div/table/tbody”?我发现长的文字 XPath 表达式很难调试,因为我的眼睛很容易被欺骗……所以我将它们分解,直到它确实起作用,然后重新构建。

于 2010-09-01T21:38:40.403 回答
1

一种替代方法可能是:-

//div[@class='definition' or @class='example']

这将在文档中任何“class”属性值等于“definition”或“example”的地方搜索“div”元素。

我发现这种方法更清楚地说明了您试图从页面中检索的内容。另一个好处是,如果页面结构发生变化,但 div 类保持不变,则不需要更新 xpath。

您还可以使用以下非常有用的 firefox 插件来检查您的 xpath 是否适用于 HTML 文档。

Firefox 插件 - XPath 检查器 0.4.4

于 2013-06-27T11:35:07.603 回答