1

dom4jを使用してxhtmlドキュメントを解析しようとしています。ドキュメントを印刷するだけで、ドキュメント全体が表示されるので、正しく読み込まれていることがわかります。私が選択しようとしている2つの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");、それは実際にその中に1つの要素を持つリストを返します。だから私は私のxpathの何が悪いのか、そしてなぜそれがそれらのdivを見つけられないのかについて混乱しています

4

3 に答える 3

3

xhtml 名前空間を xpath に宣言してみてください。たとえば、それをプレフィックスにバインドし、XPath 式としてx使用します (プレーンな Java ではなく Groovyに関するこの記事も参照してください)。おそらく、Javaで次のようなことを行う必要があります。//x:html/x:body...

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[@class='definition' or @class='example']

これは、"definition" または "example" と等しい "class" 属性値を持つドキュメント内の任意の場所で、"div" 要素を検索します。

このアプローチは、ページから何を取得しようとしているのかをより明確に示しています。追加の利点は、ページの構造が変更されても div クラスが同じままである場合、xpath を更新する必要がないことです。

また、非常に便利な次の firefox プラグインを使用して、HTML ドキュメントに対して xpath の動作を確認することもできます。

Firefox プラグイン - XPath チェッカー 0.4.4

于 2013-06-27T11:35:07.603 に答える
1

「//div」だけではどうですか?または「//html/body/div/table/tbody」? 長いリテラル XPath 式はデバッグが難しいことがわかりました。なぜなら、私の目は簡単にだまされてしまうからです...そのため、機能するまでそれらを分解してから、再度構築します。

于 2010-09-01T21:38:40.403 に答える