将HTML插入到HTML文档的正文中

7

这似乎是一个很简单的问题,但我却遇到了很大的困难。

问题:

我有一些文本要插入到一个 HTMLDocument 中。这些文本有时候也会指定一些 HTML。例如:

Some <br />Random <b>HTML</b>

我正在使用HTMLEditorKit.insertHTML在指定的偏移量处插入文本。这个方法很好用,除非该偏移量位于文档开头(偏移量=1)。在这种情况下,文本会被插入到文档的而不是中。

示例:

editorKitInstance.insertHTML(doc, offset, "<font>"+stringToInsert+"</font>", 0, 0, HTML.Tag.FONT);

我使用字体标签,这样我插入的内容就会在没有属性的字体标签中,因此不会影响格式。我需要知道这一点,因为最后一个参数 insertTag 是必需的,而且在运行时我无法知道 stringToInsert 的内容。如果文档中已经有文本(例如“1234567890”),那么输出结果如下:

<html>
  <head>

  </head>
  <body>
    <p style="margin-top: 0">
      1234567890 <font>something <br />Some <br />Random <b>HTML</b></font>
    </p>
  </body>
</html>

然而,如果偏移量为1且文档为空,则结果如下:
<html>
  <head>

<font>Some <br />Random <b>HTML</b></font>
  </head>
  <body>
  </body>
</html>

其他注意事项:

  • 所有操作都在 JEditorPane 的内部文档上进行。如果有更好的方法可以替换潜在包含 HTML 的 JEditorPane 中的文本,我也会乐意接受这些想法。

感谢您的帮助!谢谢!

1个回答

8

关于HTMLDocument的内部结构,有几件事情您需要知道。

  • 首先,文档正文并不是从位置0开始的。文档的所有文本内容都存储在javax.swing.text.AbstractDocument$Content实例中,其中包括标题和脚本标签。任何文档和编辑器工具函数中的位置/偏移参数都指向此Content实例中的文本!您必须确定正文元素的起始位置才能正确地将内容插入正文中。顺便说一下:即使您没有在HTML中定义正文元素,解析器也会自动生成它。
  • 简单地在一个位置插入内容往往会产生意想不到的副作用。您需要了解要将内容放在与该位置处(HTML)元素相关的位置。例如,如果您的文档中有以下文本:...</span><span>... - 只有一个位置(指Content实例),分别为“在第一个span结束后”、“在span之间”和“在第二个span开始时”。为了解决这个问题,HTMLDocument API中有4个函数:
    • insertAfterEnd
    • insertAfterStart
    • insertBeforeEnd
    • insertBeforeStart

总之,对于通用解决方案,您必须找到BODY元素,告诉文档在正文的“insertAfterStart”位置和正文元素的起始偏移处插入内容。

以下代码片段应该在任何情况下都有效:

HTMLDocument htmlDoc = ...;
Element[] roots = htmlDoc.getRootElements(); // #0 is the HTML element, #1 the bidi-root
Element body = null;
for( int i = 0; i < roots[0].getElementCount(); i++ ) {
    Element element = roots[0].getElement( i );
    if( element.getAttributes().getAttribute( StyleConstants.NameAttribute ) == HTML.Tag.BODY ) {
        body = element;
        break;
    }
}
htmlDoc.insertAfterStart( body, "<font>text</font>" );

如果您确定头部始终为空,还有另一种方法:
kit.read( new StringReader( "<font>test</font>" ), htmlDoc, 1 );

但是如果头部不为空,这将抛出一个 RuntimeException 异常。

顺便说一下,我更喜欢使用 JWebEngine 来处理和渲染 HTML 内容,因为它保持头部和内容分离,所以在位置 0 插入始终有效。


"HTMLDocument htmlDoc = ...;" 这一行应该填什么? - bandit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接