dom4j XPath无法解析xhtml文档

时间:2010-09-01 20:29:00

标签: java xml dom4j xpath

我正在尝试使用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

3 个答案:

答案 0 :(得分:3)

尝试将xhtml命名空间声明为xpath,例如将它绑定到前缀x并使用//x:html/x:body...作为XPath表达式(另请参阅this article,但对于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);

(未测试的)

答案 1 :(得分:1)

只是“// div”怎么样?或者“// html / body / div / table / tbody”?我发现很长的文字XPath表达式难以调试,因为我的眼睛很容易被欺骗......所以我将它们分解,直到它工作然后重新构建。

答案 2 :(得分:1)

另一种选择可能是: -

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

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

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

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

Firefox Plugin - XPath Checker 0.4.4