【问题标题】:Insert HTML into the Body of an HTMLDocument将 HTML 插入 HTMLDocument 的正文
【发布时间】:2011-03-29 02:14:51
【问题描述】:

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

问题:

我有一些文本要插入HTMLDocument。该文本有时也会指定一些 html。例如:

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

我使用HTMLEditorKit.insertHTML 将其插入到指定的偏移量。这工作正常,除非偏移量位于文档的开头(偏移量 = 1)。在这种情况下,文本将插入到文档的 head 而不是 body

示例:

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 的内部文档。如果 有更好的方法来替换文本 在JEditorPane 有潜力 HTML 我愿意接受这些想法 也一样。

任何帮助将不胜感激。 谢谢!

【问题讨论】:

    标签: java html jeditorpane htmleditorkit


    【解决方案1】:

    关于 HTMLDocument 的内部结构,您应该了解几件事。

    • 首先 - 正文不是从位置 0 开始。文档的所有文本内容都存储在 javax.swing.text.AbstractDocument$Content 的实例中。这也包括标题和脚本标签。 ANY 文档和编辑器工具包函数的位置/偏移参数是指此 Content 实例中的文本!您必须确定 body 元素的开始才能正确地将内容插入到正文中。顺便说一句:即使您没有在 HTML 中定义 body 元素,它也会由解析器自动生成。
    • 仅在某个位置插入往往会产生意想不到的副作用。您需要知道要将内容相对于该位置的 (HTML) 元素放在哪里。例如。如果您的文档中有以下文本:“...&lt;/span&gt;&lt;span&gt;...”-“在第一个跨度的末尾”、“在跨度之间”和“在第二个跨度”。为了解决这个问题,HTMLDocument API 中有 4 个函数:
      • 插入结束后
      • 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>" );
    

    如果你确定header总是为空,还有另一种方法:

    kit.read( new StringReader( "<font>test</font>" ), htmlDoc, 1 );
    

    但是,如果标头不为空,则会抛出 RuntimeException。

    顺便说一句,我更喜欢使用JWebEngine 来处理和呈现 HTML 内容,因为它保持标题和内容分开,所以在位置 0 插入总是有效的。

    【讨论】:

    • 什么应该在“HTMLDocument htmlDoc = ...;”行?
    猜你喜欢
    • 2023-03-25
    • 2011-11-28
    • 1970-01-01
    • 2023-03-24
    • 2017-03-03
    • 2014-04-27
    • 2018-05-25
    • 1970-01-01
    • 2016-09-15
    相关资源
    最近更新 更多