我無法將下面的 HTML 放入如下串列中:
List<String> output = Arrays.asList(
new String[] {
"First Level-Second Level--Third Level",
"a-b--c1",
"a-b--c2",
"a-b--c3",
"a-b2--c1",
"a-b2--c2",
"a-b2--c3"
});
<ul>
<li>First Level</li>
<ul>
<li>Second Level</li>
<ul>
<li>Third Level</li>
</ul>
</ul>
<li>a</li>
<ul>
<li>b</li>
<ul>
<li>c</li>
<li>c</li>
<li>c</li>
</ul>
<li>b2</li>
<ul>
<li>c1</li>
<li>c2</li>
<li>c3</li>
</ul>
</ul>
</ul>
我已經將它加載到 Jsoup 中,像元素一樣遍歷它們。我的代碼如下:
public static String recHTML(Element element, String str) {
str = "-" element.ownText();
if (element.children().size() == 0) return str "--" element.ownText();
else {
for (int i = 0; i < element.children().size(); i ) {
Element next = element.child(i);
str = recHTML(next, str);
}
}
}
我正在回傳帶有破折號的字串,以使用正則運算式將它們拆分為一個陣列以具有不同級別的縮進。我正在努力使我的輸出匹配,無論我嘗試什么,我都無法讓它發揮作用。任何幫助將不勝感激,謝謝。
uj5u.com熱心網友回復:
假設您創建了一個如下所示的程式存根:
import java.util.ArrayList;
import java.util.List;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Element;
public class App {
private static List<String> output = new ArrayList<String>();
public static void main(String[] args) {
Element input = Jsoup.parse(/*your HTML list*/).selectFirst("body").child(0);
recHTML(input, "", "");
System.out.println(output);
}
public static void recHTML(Element element, String chain, String link) {
// Todo!
}
}
現在讓我們考慮您的無效 HTML 示例及其有效等價物
無效的 HTML 輸入串列
<ul>
<li>First Level</li>
<ul>
<li>Second Level</li>
<ul>
<li>Third Level</li>
</ul>
</ul>
<li>a</li>
<ul>
<li>b</li>
<ul>
<li>c</li>
<li>c</li>
<li>c</li>
</ul>
<li>b2</li>
<ul>
<li>c1</li>
<li>c2</li>
<li>c3</li>
</ul>
</ul>
</ul>
目前,您正在嘗試實作諸如深度優先搜索 (DFS) 之類的東西。典型的 DFS 不會這樣做。為什么?因為您提供的 HTML 結構具有多個不終止鏈的葉節點。
假設我們稱您的每個元素為outputa chain。當您以 DFS 方式遍歷 HTML 樹時,請注意,一旦您找到沒有兄弟元素的元素,則鏈是完整的。這應該是您的最終條件。至于遞回步驟,想想如何處理和元素。不容易定義;目前,我的解決方案僅適用于您的特定輸入。liululli
您對此的實作肯定是丑陋的,因為從根節點到葉節點recHTML沒有直接的嵌套鏈。新的邊緣案例將不斷出現,您的代碼將無法作業,您將繼續進行編輯。
public static void recHTML(Element element, String chain, String link) {
if (element.parent().children().select("ul").isEmpty()) {
output.add(chain);
}
for (int i = 0; i < element.children().size(); i ) {
Element next = element.child(i);
if (next.tagName().equals("ul")) {
recHTML(next, chain link element.child(i - 1).ownText(), link '-');
} else {
recHTML(next, chain link next.ownText(), link);
}
}
}
有效的 HTML 輸入串列
<ul>
<li>
First level
<ul>
<li>
Second Level
<ul>
<li>Third Level</li>
</ul>
</li>
</ul>
</li>
<li>
a
<ul>
<li>
b
<ul>
<li>c</li>
<li>c</li>
<li>c</li>
</ul>
</li>
<li>
b2
<ul>
<li>c1</li>
<li>c2</li>
<li>c3</li>
</ul>
</li>
</ul>
</li>
</ul>
正如我在評論中所建議的那樣,您的問題在于輸入。假設我們以某種方式將您的輸入 HTML 轉換為上述標記。然后解決方案變得更加簡潔和直接 - 一個簡單的 DFS 就可以了!
public static void recHTML(Element element, String chain, String link) {
if (element.children().isEmpty()) {
output.add(chain);
}
for (Element child : element.children()) {
if (child.tagName().equals("li")) {
recHTML(child, chain link child.ownText(), link "-");
} else {
recHTML(child, chain, link);
}
}
}
有趣的事實:Java HTML 整理工具JTidy以與我略有不同的方式更正了您的 HTML 輸入:
<!-- original snippet -->
<li>First Level</li>
<ul>
<li>Second Level</li>
<!-- omitted elements for brevity -->
</ul>
<!-- snippet, corrected by jtidy -->
<li>First Level</li>
<li style="list-style: none">
<ul>
<li>Second Level</li>
<!-- omitted elements for brevity -->
</ul>
</li>
就個人而言,我認為它沒有以正確的方式糾正它 -制作 HTML 嵌套串列的正確方法?
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/489059.html
上一篇:子值的SQL樹遞回平均值
下一篇:將串列物件轉換為另一個結構
