【发布时间】:2016-11-02 18:03:39
【问题描述】:
所以我正在尝试编写一个程序,该程序将包含简单 HTML 语法的文件放入树中,该树将显示标签的层次结构。最终,每个叶子都将包含一个标签(即 p、h、ul 等)和文本。其中大部分非常简单,我计划使用 Jtree 来显示最终输出。但是,我遇到的困难是通过语法并在不丢失关系的情况下使用标签构建初始树。我认为整个文件将是一个长字符串。该程序将找到一个“
希望你能得到我想要做的事情,不幸的是,我的尝试并不成功,因为它只显示了根标记的子节点。目前,我只是想让标签在树、文本和我以后无法弄清楚的东西中工作。为了测试代码,我使用了一个字符串"test",其中包含一些基本的示例 html 代码,创建 jtree 时每个节点都显示在根目录中,但 node2 中的子节点从不显示。我很困惑,无法解决这个问题。另外,有没有更简单/有效的方法来做到这一点?
**编辑:所以我修改了代码以使用 JSoup 工作。我设法让它工作,但是,我遇到了一个问题,由于某种原因,除了head 标签的第一个子标签之外的所有标签都被移到了body 下。所以现在body 有 3 个孩子而不是 1 个,head 只有 1 个而不是 3 个。另外,我将如何修改getChildren() 递归函数以适用于前一个子层中的每个子层?例如,要在title 标签中获取h3 标签?
package weboqltree_converter;
import javax.swing.JFrame;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.tree.DefaultMutableTreeNode;
import java.util.ArrayList;
import java.awt.Dimension;
import java.util.List;
import javax.swing.tree.TreeNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Node;
public class GUI extends JFrame
{
private JTree tree;
private String test = "<html>"
+ "<head>"
+ "<title><h3>First parse<h3></title>"
+ "<a></a>"
+ "<h3></h3>"
+ "</head>"
+ "<body>"
+ "<p>Parsed HTML into a doc.</p>"
+ "</body>"
+ "</html>";
private int parentNode;
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new GUI();
}
});
}
public GUI()
{
DefaultMutableTreeNode html = new DefaultMutableTreeNode("html");
Document doc = Jsoup.parse(test);
int children = doc.childNodes().get(0).childNodes().size();
for(int i=0; i < children; i++){
String tag = doc.childNodes().get(0).childNodes().get(i).nodeName();
String text = "N/A"; //doc.childNodes().get(0).childNodes().get(i).toString();
html.add(new DefaultMutableTreeNode("Tag: " + tag+ ", Text: " + text));
System.out.println(tag+" : "+doc.childNodes().get(0).childNodes().get(i).childNodeSize());
if(doc.childNodes().get(0).childNodes().get(i).childNodeSize() > 0){
getChildren(html.getLastLeaf(), doc.childNodes().get(0).childNodes().get(i),0, doc.childNodes().get(0).childNodes().get(i).childNodeSize());
}
}
System.out.println("tag: " + children);
//System.out.println(Tree.get(2) +" "+Tree.get(2).getChildCount());
tree = new JTree(html);
add(tree);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("JTree Example");
this.setMinimumSize(new Dimension(300, 400));
this.setExtendedState(3);
this.pack();
this.setVisible(true);
}
public void getChildren(DefaultMutableTreeNode tree, Node doc, int start, int size){
tree.add(new DefaultMutableTreeNode("Tag: " + doc.childNodes().get(start).nodeName()));
start++;
if(start < size){
getChildren(tree, doc, start, size);
}
}
}
【问题讨论】:
-
你可以看看这个:davidcraddock.net/?s=scraping
标签: java html arrays parsing tree