Поскольку HTML-файлы, как правило, проблематичны, вам необходимо сначала очистить их с помощью анализатора / сканера. Я использовал JTidy, но никогда не был доволен. NekoHTML работает хорошо, но любой из этих инструментов всегда просто дает лучшее предположение о том, что предполагается. Вы фактически просите позволить программе изменять разметку документа, пока она не будет соответствовать схеме. Это может вызвать структурную (разметка), стиль или потерю контента. Это неизбежно, и вы действительно не будете знать, чего не хватает, если не будете вручную сканировать через браузер (и тогда вам придется также доверять браузеру).
Это действительно зависит от вашей цели & mdash; если у вас есть тысячи уродливых документов с тоннами посторонней (не HTML) разметки, то ручной процесс, вероятно, нецелесообразен. Если вашей целью является точность в нескольких важных документах, то ручное исправление является разумным предложением.
Одним из подходов является ручной процесс многократной передачи источника через правильно сформированный и / или проверяющий синтаксический анализатор в цикле редактирования с использованием сообщений об ошибках, чтобы в конечном итоге исправить сломанную разметку. Это требует некоторого понимания XML, но это не плохое образование.
В Java 5 необходимые функции XML & mdash; называется JAXP API & mdash; теперь встроены в саму Java; вам не нужны внешние библиотеки.
Сначала вы получаете экземпляр DocumentBuilderFactory, устанавливаете его функции, создаете DocumentBuilder (синтаксический анализатор), а затем вызываете его метод parse () с InputSource. 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-интерфейсы JDOM и XOM, и хотя они имеют некоторые преимущества по сравнению с API-интерфейсами SAX и DOM в JAXP, они требуют добавления не-Java-библиотек. DOM может быть несколько громоздким, но после стольких лет его использования я уже не против.