跨度内跨度的HTMLDocument支持

时间:2013-06-19 14:41:33

标签: java html dom

我正在尝试在HTMLDocument中插入此文本:

<html><span class='stuff' id='X'><span id='Y'>content</span></span></html>

使用此代码:

String test = "<html><span class='stuff' id='X'><span id='Y'>content</span></span></html>";
editorKit.read(new StringReader(test), htmlDocument, 0);

我希望从文件中读到这一点:

<html><head></head><body><span class='stuff' id='X'><span id='Y'>content</span></span></body></html>

但我改为阅读:

<html><head></head><body><span id="Y">content</span></body></html>

外跨度消失了(不幸的是,这对我来说是最重要的)。

我猜这种情况正在发生,因为Java会发现具有相同起始位置和结束位置的2个Span节点,因此将它们融合在一起。但是为什么HTMLDocument不保持我们给他的html完整无缺?无论如何,我真的需要有2个像这样叠加的ID。我可以用&lt; div style ='display:inline'&gt;相反,但它不受支持(只有HTML 3.2)...

我可以尝试任何解决方案吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

确定。我解决了这个问题:

我使用Jsoup作为解析器,因此我使用它来选择所有内部跨度。然后我将他们的内容复制到地图中,以便能够找回它们。我删除了内部跨度,我在htmlDocument中设置了修改后的html,最后,我在htmlDocument中手动查找了外部跨度,这要归功于它们的ID并从地图中插入html读取:

    Document doc = Jsoup.parse(data);
    Elements elements = doc.select("span span");
    HashMap<String, String> map = new HashMap<String,String>();
    for(Element e : elements) {
        Element parent = e.getParent();
        map.put(parent.attr("id"),e.outerhtml());
        parent.html("PENDING");//the node should not be empty otherwise HTMLDocument will think it is free to remove it...
    }
    editorKit.read(new StringReader(doc.html()), htmlDocument, 0);
    javax.swing.text.Element element = htmlDocument.getElement(id);
    int position = element.getStartOffset();
    new HTMLEditorKit().insertHTML(htmlDocument,position,map.get(id),1,0,Tag.SPAN);