7

これはとても簡単な質問のように思えますが、私はそれでとても苦労しています。

問題:

に挿入するテキストがあります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 に置き換えるより良い方法があれば、それらのアイデアも受け入れます。

どんな助けでも大歓迎です。 ありがとう!

4

1 に答える 1

8

HTMLDocument の内部構造について知っておくべきことがいくつかあります。

  • まず第一に、本文は位置 0 から始まりません。ドキュメントのすべてのテキスト コンテンツは のインスタンスに格納されますjavax.swing.text.AbstractDocument$Content。これには、title タグと script タグも含まれます。任意のドキュメントおよびエディタ キット関数の位置/オフセット引数は、この Content インスタンスのテキストを参照します! 本文にコンテンツを正しく挿入するには、body 要素の開始を決定する必要があります。ところで: HTML で body 要素を定義していなくても、パーサーによって自動生成されます。
  • 単純にある位置に挿入すると、予期しない副作用が発生する傾向があります。この位置の (HTML) 要素に関連して、コンテンツを配置する場所を知る必要があります。たとえば、ドキュメントに次のテキストがある場合: " ...</span><span>..." - 「最初のスパンの終わり」、「スパンの間」、および「2 番目のスパンの開始」の位置 (Content インスタンスを参照) は 1 つだけです。スパン"。この問題を解決するために、HTMLDocument API には 4 つの関数があります。
    • 挿入後終了
    • insertAfterStart
    • insertBeforeEnd
    • insertBeforeStart

結論として、一般的な解決策として、BODY 要素を見つけて、本文の "insertAfterStart" と body 要素の開始オフセットをドキュメントに指示する必要があります。

次の抜粋は、どのような場合でも機能するはずです。

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 への挿入は常に機能します。

于 2010-08-19T07:41:52.190 に答える