gpt4 book ai didi

java - 使用 Jsoup 获取直接从父级继承的子元素?

转载 作者:行者123 更新时间:2023-12-01 09:41:47 28 4
gpt4 key购买 nike

我的 HTML 树中有类似下面的内容。我想通过迭代 div 来创建 JSON,记住哪个 data-view 实际上是哪个父 data-view 的子级。最终结果类似于 {"main":{"header":{"navbar":"some txt","static":"some text"},"slider":"some txt","footer":"一些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>

我已经尝试过

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

但这给了我所有的子元素,并且无法找到哪些子元素属于哪个父元素?如果可以通过其他库实现相同的目标,我很高兴打开它。更新:更新了我的 html 以了解确切的场景。请注意,

  • 我必须专注并迭代数据 View 节点,只记住哪个节点实际上是哪个父节点的子节点。
  • 数据文本节点始终包含在某些数据 View 节点中。
  • 请注意,它是包含数据文本节点的数据 View 节点模式。

最佳答案

是的,您可以使用 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

关于java - 使用 Jsoup 获取直接从父级继承的子元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38395047/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com