Есть ли Java-парсеры Java, где сгенерированные узлы сохраняют индексы к исходному тексту?

Я хотел бы запросить HTML-документ как XML (например, с XPath), поэтому мне нужно передать HTML через некоторую форму очистки HTML.

Но я также хотел бы внести изменения в исходную исходную строку на основе результатов запросов.

Существует ли парсер Java Java, который сохраняет индексы в исходной исходной строке, поэтому я могу найти node и изменить правильную часть исходной строки?

Приветствия.

Ответ 1

Похоже, что Иерихон - это почти то, что вы хотите. Это надежный HTML-парсер, разработанный специально для создания неинтрузивных изменений исходного документа.

В то время как он не поставляется с интерфейсами DOM, SAX или StAX, у него есть пользовательские API, которые достаточно похожи на те стандарты, что вы должны легко адаптировать свой подход к ним или написать адаптер между тем, что вы используют и Иерихон. Например, вы можете делать запросы XPath в документах Jericho с помощью Jaxen - см. эту запись в блоге для примера.

Jericho имеет begin и атрибуты конца для каждого элемента и даже для частей элемента, таких как имя тега или даже имя атрибута, поэтому вы можете редактировать документ самостоятельно с этой информацией, но там, где действительно сияет Иерихон, является класс OutputDocument, который позволяет напрямую указывать замены, вызывая соответствующие методы с элементами Jericho, которые соответствуют вашему запросу, вместо того, чтобы явно вызвать getBegin() и getEnd() на них и передать это методу замещения.

Ответ 2

Мы используем jericho html parser для синтаксического анализа и htmlcleaner, чтобы выполнить фактическую очистку.

У нас были проблемы с поведением Джерико в серверном приложении (управление памятью, протоколирование), которое мы исправили. (оригинальный разработчик не думал, что наши проблемы достаточно важны, чтобы помещать главную ветку кода). Наша вилка находится на github. Мы также установили исправления в htmlcleaner.

Ответ 3

Я не знаю о части "сохранить индексы к исходному тексту", но Jericho - очень хорошая библиотека парсеров HTML.

Вот пример того, как удалить каждый диапазон из html:

public static String removeSpans(String html) {
    Source source = new Source(html);
    source.fullSequentialParse();
    OutputDocument outputDocument = new OutputDocument(source);
    List<Tag> tags = source.getAllTags();
    for (Tag tag : tags) {
        String tagname = tag.getName().toLowerCase();
        if (tagname.equals("span")) {
            //remove the <span>
            outputDocument.remove(tag);
        }
    }
    return outputDocument.toString();
}

Ответ 5

Как и другие, вы, вероятно, захотите отобразить DOM. Это просто означает создание дерева node, оно не изменит источник документа, если вы не используете очиститель HTML, например jTidy. Затем вы легко получаете доступ к документу и можете его модифицировать по мере необходимости. Я бы предложил DOM4J, у него есть хорошая поддержка api и xpath.

Повторите свое требование "индексирования" во время вашего обхода/запроса документа, который вы можете кэшировать в списке, или сопоставить любые элементы или узлы, которые вы хотите изменить текст в более поздней точке.

Ответ 6

это отлично работает

http://jtidy.sourceforge.net/

Пример

Tidy tidy = new Tidy(); // obtain a new Tidy instance
tidy.setXHTML(boolean xhtml); // set desired config options using tidy setters 
...                           // (equivalent to command line options)

tidy.parse(inputStream, System.out);

Для обхода DOM я рекомендую использовать JDOM, быстрее, чем простой XML.

http://www.jdom.org/

DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.newDocument();
Element root = doc.createElement("root");
Text text = doc.createText("This is the root");
root.appendChild(text);
doc.appendChild(root);

Что касается реализации, я бы сделал новый документ и добавил к нему узлы из источника.

Ответ 7

Вы можете попробовать ANTLR с грамматикой HTML.

Вы можете использовать (по крайней мере) 2 подхода - попробуйте использовать его как фактический синтаксический анализатор HTML, а затем получите индексы в исходную строку, которая вас интересует.

Или он также имеет встроенную поддержку для выполнения преобразований на месте в исходном тексте, где вы определяете преобразования, которые вы хотите выполнить в тексте, как часть грамматики.