Вставьте HTML в тело HTMLDocument

Это походит на такой простой вопрос, но я испытываю такие трудности с ним.

Проблема:

У меня есть некоторый текст для вставки в 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>

Другие примечания:

  • Это все делается на innerdocument a JEditorPane. Если существует лучший способ заменить текст в a JEditorPane с потенциальным HTML я был бы открыт для тех идей также.

Любая справка ценилась бы.Спасибо!

7
задан Robbie 12 August 2010 в 18:23
поделиться

1 ответ

Есть несколько вещей, которые вам следует знать о внутренней структуре HTMLDocument.

  • Во-первых, тело не начинается с позиции 0. Все текстовое содержимое документа сохраняется в экземпляре javax.swing.text.AbstractDocument $ Content . Сюда также входят теги title и script. Аргумент позиции / смещения ЛЮБОГО документа и функции набора редактора относится к тексту в этом экземпляре Content! Вы должны определить начало элемента тела, чтобы правильно вставить содержимое в тело. Кстати: даже если вы не определили элемент body в своем HTML, он будет автоматически сгенерирован парсером.
  • Простая вставка в позицию может иметь неожиданные побочные эффекты. Вам нужно знать, где вы хотите разместить контент по отношению к элементам (HTML) в этой позиции. Например. если в вашем документе есть следующий текст: " ... ... " - есть только одна позиция (относящаяся к экземпляру Content) для "в конце первый пролет »,« между пролетами »и« в начале второго пролета ». Для решения этой проблемы в HTMLDocument API есть 4 функции:
    • insertAfterEnd
    • 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 всегда работает.

8
ответ дан 7 December 2019 в 05:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: