2016-07-15 21 views
0

私のHTMLツリーには以下のようなものがあります。私はdata-viewが実際には親子の子であるdiv30を反復してJSONを作成したいと考えています。data-view最終的な結果は、私がJsoupで親から直接子要素を取得しますか?

for (int z = 0; z < doc.getElementsByAttributeStarting("data-view").size(); z++){ 
    String dtview= doc.getElementsByAttributeStarting("data-view").get(z).attr("mt-class") 
} 

を試してみました。しかし、これは私のすべての子要素を与え、親のどの属する子ども見つける方法がありません?{"main":{"header":{"navbar":"some txt","static":"some text"},"slider":"some txt","footer":"some txt"}}

<div id="loader-div"></div> 
<div class="main-container"> 
    <div data-view="main" data-class="main_class"> 
     <div class="details_container"> 
      <h1>Helo Text</h1> 
      <div data-view="header" data-class="header_class"> 
       <h2>Hello Header</h2> 
       <div data-view="navbar" data-class="navbar_class"> 
        <h2>sdf</h2> 
        <span data-text="navbarDataId">some text</span> 
       </div> 
       <div class="brder_bttm clearfix"> 
        <div data-view="static" data-class="static_class"> 
         <span data-text="navbarDataId">some text</span> 
         <button data-event="show_all" class="btn btn-block btn-success">Show All</button> 
        </div> 
       </div> 
       <span>some text</span> 
      </div> 
      <div class="slider_container"> 
       <div data-view="slider" data-class="slider_class"> 
        <span data-text="sliderDataId">some text</span> 
       </div> 
      </div> 
      <div data-view="footer" data-class="footer_class"> 
       <span data-text="footerDataId">some text</span> 
      </div> 
     </div> 
    </div> 
</div> 

ようになりますか他の図書館でも同じことが達成できれば、私はそれを切り換えてうれしいです。 更新:厳密なシナリオのために私のhtmlを更新しました。注意:

  • どのノードが実際にどの親の子であるかを念頭に置くだけで、データビューノードに集中して反復する必要があります。
  • データテキストノードは、常に一部のデータビューノードに含まれます。
  • データ・テキスト・ノードを含むデータ・ビュー・ノードのパターンに注目してください。
+0

が予想される出力は同じですか? –

+0

@DavidePastore予想されるjson出力も更新しました。ほぼ同じですが。 –

+0

@DavidePastore退出を見つけましたか? –

答えて

1

はい、Jsoupを使用して実行できます。 HTMLからJSONを動的に生成するために呼び出される再帰的メソッドを作成しました。

package com.github.davidepastore.stackoverflow38395047; 

import org.json.JSONObject; 
import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 
import org.jsoup.select.Elements; 

/** 
* Stackoverflow 38395047 answer. 
* 
*/ 
public class App { 
    public static void main(String[] args) { 
     String html = "<div data-view=\"main\">\r\n" 
       + " <div data-view=\"header\">\r\n" 
       + "  <div data-view=\"navbar\">\r\n" 
       + "   <span>some text</span>\r\n" 
       + "  </div>\r\n" + "  <span>some text</span>\r\n" 
       + " </div>\r\n" + " <div data-view=\"slider\">\r\n" 
       + "  <span>some text</span>\r\n" + " </div>\r\n" 
       + " <div data-view=\"footer\">\r\n" 
       + "  <span>some text</span>\r\n" + " </div>\r\n" 
       + "</div>"; 
     JSONObject json = new JSONObject(); 

     Document document = Jsoup.parse(html); 
     Element body = document.select("body").first(); 
     json = (JSONObject) generateJson(body); 
     System.out.println(json.toString(2)); 
    } 

    public static Object generateJson(Element element){ 
     JSONObject json = new JSONObject(); 
     Elements children = element.children(); 
     for (Element child : children) { 
      if(child.tagName().equals("div")){ 
       String dataView = child.attr("data-view"); 
       json.put(dataView, generateJson(child)); 
      } else if(json.keySet().size() == 0){ 
       return child.text(); 
      } 
     } 
     return json; 
    } 
} 

出力:あなたの更新の例では

{"main": { 
    "footer": "some text", 
    "slider": "some text", 
    "header": {"navbar": "some text"} 
}} 

Additional library for JSON

+0

最高のMate.But私はコンテナのdiv(s)もいくつかの異なるクラスn属性、そのシナリオでの破損があります。 –

+0

こんにちは@PrototypeChain元の質問を編集して、別のシナリオを見てください。 –

+0

私の質問をhtmlで更新してください。そのパターンバディを見てください。 'data-view'ノードはどこにでもあり、ラッパーdivでもラップすることができます。また、データ・テキスト・ノードは、一部のデータ・ビュー・ノードにしか含めることができません。 –

関連する問題