这似乎是一个很简单的问题,但我却很难回答。
问题:
我有一些文本要插入到 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 我愿意接受这些想法
如有任何帮助,我们将不胜感激。 谢谢!
最佳答案
关于 HTMLDocument 的内部结构,您应该了解几件事。
- 首先 - 主体不是从位置 0 开始。文档的所有文本内容都存储在
javax.swing.text.AbstractDocument$Content
的实例中。 .这也包括标题和脚本标签。任何文档和编辑器工具包函数的位置/偏移量参数都引用此 Content 实例中的文本!您必须确定正文元素的开始才能将内容正确地插入到正文中。顺便说一句:即使您没有在 HTML 中定义 body 元素,它也会由解析器自动生成。 - 简单地插入一个位置往往会产生意想不到的副作用。您需要知道要将与该位置的 (HTML) 元素相关的内容放在哪里。例如。如果您的文档中有以下文本:“
...</span><span>...
” - 只有一个位置(指的是 Content 实例)表示“在第一个跨度的末尾”、“跨度之间”和“在第一个跨度的开始处”第二个跨度”。为了解决这个问题,HTMLDocument API 中有 4 个函数:- 插入结束后
- 开始后插入
- 插入前结束
- 开始前插入
作为结论:对于一般的解决方案,您必须找到 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 );
但如果 header 不为空,这将抛出 RuntimeException。
顺便说一下,我更喜欢使用 JWebEngine处理和呈现 HTML 内容,因为它保持标题和内容分离,因此在位置 0 插入始终有效。
关于java - 将 HTML 插入到 HTMLDocument 的主体中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3470683/