Чтение файла HTML к дереву DOM с помощью Java

Проблема в том, что getAsString() является асинхронным, поэтому вы пытаетесь прочитать c до того, как значение было установлено.

Чтобы исправить это, извлеките логику, зависящую от c, в ее собственную функцию и вызовите эту функцию в обратном вызове getAsString():

$('body').on('paste', function(e) {
  var c = "";
  var dt = e.originalEvent.clipboardData;

  if (dt && dt.items && dt.items[0]) {
    dt.items[0].getAsString(function(text) {
      $('.log').text(text);
      doStuff(text);
    });
  } else {
    if (dt && ('getData' in dt)) {
      $('.log').text(dt.getData('text'));
      doStuff(dt.getData('text'));
    }
  }
});

function doStuff(foo) {
  console.log('You pasted', foo);
}
[ 111]

12
задан Eric Leschinski 30 May 2016 в 19:28
поделиться

4 ответа

JTidy, или путем обработки потока к XHTML затем с помощью любимой реализации DOM, чтобы повторно проанализировать, или с помощью parseDOM, если ограниченный импорт DOM, который дает Вам, достаточно.

Кроме того, Neko.

6
ответ дан 2 December 2019 в 22:39
поделиться

TagSoup может сделать то, что Вы хотите.

0
ответ дан 2 December 2019 в 22:39
поделиться

Синтаксический анализатор Apache Xerces2 должен сделать то, что Вы хотите.

-1
ответ дан 2 December 2019 в 22:39
поделиться

Поскольку HTML-файлы, как правило, проблематичны, вам нужно сначала очистить их с помощью анализатора / сканера. Я использовал jtidy, но никогда не счастливо. Nekohtml работает хорошо, но любой из этих инструментов всегда просто делает лучшее предположение о том, что предназначено. Вы эффективно просим позволить программу изменять разметку документа, пока не соответствует схеме. Которые могут вызвать структурную (разметку), стиль или потери содержания. Это неизбежно, и вы не будете знать, что отсутствует, если вы не сканируете вручную через браузер (а затем вам придется доверять браузеру).

Это действительно зависит от вашей цели - если у вас есть тысячи уродливых документов с тоннами посторонней (не HTML) разметки, то ручной процесс, вероятно, неразумно. Если ваша цель - точность на несколько важных документов, то их вручную фиксируя их, является разумным предложением.

Один из подходов - это ручной процесс многократно передавать источник через хорошо сформированный и / или проверяющий анализатор в цикле редактирования, используя сообщения об ошибках, чтобы в конечном итоге исправить разбивку. Это требует некоторого понимания XML, но это не плохое образование для проведения.

С Java 5 необходимые XML-функции - называется JAXP API - теперь встроены в сам Java; Вам не нужны внешние библиотеки.

Сначала вы получите экземпляр DocumentBuilderFiectorfactory, установите его функции, создаете документальныйБудер (Parser), затем вызовите его метод Parse () с помощью ввода. Inputsource имеет ряд возможных конструкторов, с помощью StringReader, используемый в следующем примере:

import javax.xml.parsers.*;
// ...

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(false);
dbf.setNamespaceAware(true);
dbf.setIgnoringComments(false);
dbf.setIgnoringElementContentWhitespace(false);
dbf.setExpandEntityReferences(false);
DocumentBuilder db = dbf.newDocumentBuilder();
return db.parse(new InputSource(new StringReader(source)));

Это возвращает документ DOM. Если вы не возражаете, используя внешние библиотеки, существует также API в jdome и Xom, и в то время как они имеют некоторые преимущества по поводу API на SAX и DOM в JAXP, они требуют добавления библиотек Non-Java. Дом может быть несколько громоздким, но после того, как много лет использовать его, я на самом деле больше не возражаю.

3
ответ дан 2 December 2019 в 22:39
поделиться
Другие вопросы по тегам:

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