我正在尝试使用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
答案 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文档,这非常有用。