2016-11-11 24 views
0

メソッド呼び出しではなく、純粋にCSSセレクタ構文を使用して次の兄弟を選択する方法は何ですか?現在の要素の次の兄弟のセレクタ

与えられた:

<div>Foo</div><whatever>bar</whatever> 

要素edivを表す場合、私はそれが<div>または<p>または何だ場合の<whatever>かかわらずを選択する必要があります。

String selectorForNextSibling = "... "; 
Element whatever = div.select(selectorForNextSibling).get(0); 

このようなセレクタを検索する理由は、兄弟ノードまたは子ノードのいずれかからデータを取得できる汎用メソッドを持つためです。

私はdivの位置がセレクタを計算することができないアプリケーションのHTMLを解析しようとしています。そうでなければ、これは使用した限り簡単になってしまう:私は基本的に欲しい

"div.thespecificDivID + div,div.thespecificDivID + p" 

(これは働いていた場合例:「+ DIV、+ P」)を、セレクタ上からdiv.thespecificDivID一部をドロップすることです

+0

これは解決されていますか? http://stackoverflow.com/help/someone-answers –

答えて

0

あなたはwildcard selector *

との組み合わせで直接sibling selector element + directSiblingを使用することができます:「いないメソッド呼び出し」:あなたはjsoup使用しているので、私はあなたが要求したにもかかわらず、jsoups nextElementSibling()が含まれます。

サンプルコード

String html = "<div>1A</div><p>1A 1B</p><p>1A 2B</p>\r\n" + 
     "<div>2A</div><span>2A 1B</span><p>2A 2B</p>\r\n" + 
     "<div>3A</div><p>3A 1B</p>\r\n" + 
     "<p>3A 2B</p><div></div>"; 

Document doc = Jsoup.parse(html); 

String eSelector = "div"; 

System.out.println("with e.cssSelector and \" + *\""); 
// if you also need to do something with the Element e 
doc.select(eSelector).forEach(e -> { 
    Element whatever = doc.select(e.cssSelector() + " + *").first(); 
    if(whatever != null) System.out.println("\t" + whatever.toString()); 
}); 

System.out.println("with direct selector and \" + *\""); 
// if you are only interested in Element whatever 
doc.select(eSelector + " + * ").forEach(whatever -> { 
    System.out.println("\t" + whatever.toString()); 
}); 

System.out.println("with jsoups nextElementSibling"); 
//use jsoup build in function 
doc.select(eSelector).forEach(e -> { 
    Element whatever = e.nextElementSibling(); 
    if(whatever != null) System.out.println("\t" + whatever.toString()); 
}); 

出力

with e.cssSelector and " + *" 
    <p>1A 1B</p> 
    <span>2A 1B</span> 
    <p>3A 1B</p> 
with direct selector and " + *" 
    <p>1A 1B</p> 
    <span>2A 1B</span> 
    <p>3A 1B</p> 
with jsoups nextElementSibling 
    <p>1A 1B</p> 
    <span>2A 1B</span> 
    <p>3A 1B</p> 
関連する問題