【问题标题】:dom4j XPath not working parsing xhtml documentdom4j XPath 无法解析 xhtml 文档
【发布时间】:2010-09-01 20:28:59
【问题描述】:

我正在尝试使用 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&lt;Element&gt; list = document.selectNodes("//html");,它实际上会返回一个包含一个元素的列表。所以我对我的 xpath 出了什么问题以及为什么它找不到那些 div 感到困惑

【问题讨论】:

    标签: java xml dom4j xpath


    【解决方案1】:

    尝试将 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);
    

    (未经测试)

    【讨论】:

    • 这非常有效!我没想到你能做到。我在路径中还需要一个额外的 div。但是我在没有 x: 的情况下再次尝试了它,但它没有那样工作,所以你的解决方案做到了。我认为解析 xhtml 与普通 xml 相比存在问题。
    【解决方案2】:

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

    【讨论】:

    • 这就是我想要做的。这就是我如何抓住丢失的div。但不幸的是,即使我的元素顺序正确,我仍然需要安德烈的回答才能使路径正常工作
    • 啊,是的...我错过了“xhtml”部分,所以如果文件中有命名空间,那么你肯定需要它。
    【解决方案3】:

    替代方案可能是:-

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

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

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

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

    Firefox Plugin - XPath Checker 0.4.4

    【讨论】:

      猜你喜欢
      • 2012-01-16
      • 2020-01-24
      • 2011-06-26
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 2013-07-07
      • 2012-01-08
      相关资源
      最近更新 更多