Библиотека манипулирования XHTML в Java - PullRequest
0 голосов
/ 13 августа 2011

Я ищу библиотеку / инфраструктуру Java XML / XHTML, которая может выполнить для меня следующие две задачи.

Прежде чем перейти к нескольким определениям:

  • NodeOffset(Node node, int offset) отмечает некоторую точку в текстовом узле в дереве XML.
  • nodeB, nodeI, nodeP являются соответствующими Node экземплярами нижеупомянутого дерева XHTML, а nodeSpan является некоторым вновь созданным узлом (где Node не обязательно org.w3c.dom.Node и может быть любая другая абстракция)

Превращение XHTML в простой текст

Библиотека должна иметь возможность производить вывод в виде открытого текста (например, путем реализации CharSequence или аналогичного) из заданного XHTML и обеспечивать взаимно-однозначное сопоставление между символами в выходных данных и исходным деревом узлов XHTML ( например, через функцию NodeOffset getNodeOffset(int plainTextOffset)).

Пример. Предположим, у нас есть следующий XHTML:

<p><b>GeForce</b> 9300M GS provides powerful <i>visual computing features</i> to thin and light notebooks.</p>

Тогда текстовое представление, очевидно, будет:

GeForce 9300M GS provides powerful visual computing features to thin and light notebooks.

Тогда, например,

  • getNodeOffset(0) должен вернуть узел NodeOffset(nodeB, 0)
  • getNodeOffset(40) должен вернуть узел NodeOffset(nodeI, 5)
  • getNodeOffset(80) должен вернуть узел NodeOffset(nodeP, 49).

Я могу пропустить правильные цифры, но я надеюсь, вы поняли. Повторяю пример, теперь со вставленными псевдомаркерами:

|GeForce 9300M GS provides powerful visua|l computing features to thin and light n|otebooks.

и

<p><b>|GeForce</b> 9300M GS provides powerful <i>visua|l computing features</i> to thin and light n|otebooks.</p>

Узел манипулирования

Библиотека должна обеспечивать возможность внедрения узлов в XHTML, который может охватывать дерево, возможно, пересекающее границы узла, например, через операцию NodeSet insert(Node nodeToInsert, NodeOffset start, NodeOffset end, int mode). Функция работает в двух режимах:

  • mode1 : Разделить узел для вставки, если это необходимо. В этом случае разделенные из nodeToInsert узлы возвращаются как результат операций.
  • mode2 : закрыть родительские узлы. nodeToInsert возвращается как есть.

Например: операция insert(nodeSpan, NodeOffset(nodeB, 2), NodeOffset(nodeP, 9), mode1) должна выдать

<p><b>Ge<span>Force</span></b><span> 9300M GS</span> provides powerful <i>visual computing features</i> to thin and light notebooks.</p>

insert(nodeSpan, NodeOffset(nodeB, 2), NodeOffset(nodeP, 9), mode2) операция должна дать:

<p><b>Ge</b><span><b>Force</b> 9300M GS</span> provides powerful <i>visual computing features</i> to thin and light notebooks.</p>

Это аналог того, что делают пользователи в расширенном редакторе:

Ge Сила 9300M GS

Интересно, есть ли что-нибудь подобное в мире OpenSource, поскольку я действительно не хочу повторно реализовывать колесо ... Я быстро проверил HTML-парсеры с открытым исходным кодом в Java без успех.

Когда вы отправляете ответ:

  • Убедитесь, что вышеупомянутые функции доступны в API библиотеки (укажите ссылку на JavaDoc).
  • Библиотека является родной для Java (без JNI) и OpenSource.

Ответы [ 3 ]

2 голосов
/ 10 сентября 2011

Я упаковал код, который у меня уже был, с изменениями, чтобы соответствовать вашим запросам (WIP) в проекте с открытым исходным кодом: ShtutXML . Это довольно задокументировано, поэтому я сомневаюсь, что у вас возникнут проблемы с его использованием.

Первый запрос (Нахождение узла и смещений из глобальной позиции) уже встроен, а разбиение текстовых узлов в XML уже встроено (так что вы можете легко обернуть их в новые узлы, как вы пожелаете). Поэтому добавить логику для маркировки областей с помощью элемента довольно тривиально. Я постараюсь сделать это позже, но сейчас это моя лучшая попытка выполнить этот запрос.

В вашем XML, используя мой пример программы , это мой вывод:

************* BASE DOCUMENT *****************
DOCUMENT ROOT
|-<p >
| |-<b >
| | |-Text: GeForce
| |-Text:  9300M GS provides powerful 
| |-<i >
| | |-Text: visual computing features
| |-Text:  to thin and light notebooks.

*** Text ***
"GeForce 9300M GS provides powerful visual computing features to thin and light notebooks."

*** Node of each text segment ***
[b: null]: GeForce
[p: null]:  9300M GS provides powerful 
[i: null]: visual computing features
[p: null]:  to thin and light notebooks.


*** Offset testing ***
offset 0 is at [b: null] at 0
offset 40 is at [i: null] at 5
offset 80 is at [p: null] at 48

Если попросить разделить элемент в глобальной позиции 4, получится

*********** Split(4) DOCUMENT *****************
DOCUMENT ROOT
|-<p >
| |-<b >
| | |-Text: GeFo
| | |-Text: rce
| |-Text:  9300M GS provides powerful 
| |-<i >
| | |-Text: visual computing features
| |-Text:  to thin and light notebooks.

*** Node of each text segment ***
[b: null]: GeFo
[b: null]: rce
[p: null]:  9300M GS provides powerful 
[i: null]: visual computing features
[p: null]:  to thin and light notebooks.

Конечно, это синтаксическое разделение ничего не значит для фактического кода XML, соответствующего этому документу, но оно позволит обернуть одну текстовую часть за раз любым другим узлом, который вы пожелаете.

Редактировать: Первый режим вставки уже поддерживается

Редактировать 2: Второй режим вставки уже поддерживается

Примечания:

  • Любое изменение документа, которое вы можете сделать, сделает все смещения недействительными. Использование их позже приведет к повреждению всего документа. Таким образом, после каждой модификации вы должны выполнить GetOffset для повторного получения смещений.
  • Я знаю, что некоторые функции не задокументированы. По сути, единственные функции, которые должны использоваться вне пакета, это те, которые вы запрашивали у класса StrXML. Дополнительная документация будет добавлена ​​позже, и вы можете связаться со мной по электронной почте (см. Страницу моего профиля) для вопросов.
2 голосов
/ 08 сентября 2011

Может быть, вы могли бы попробовать jsoup - http://jsoup.org.

Это библиотека Java с открытым исходным кодом, распространяемая по лицензии MIT. Его исходный код доступен на GitHub.

С домашней страницы:

jsoup - это библиотека Java для работы с реальным HTML. Он предоставляет очень удобный API для извлечения и манипулирования данными, используя лучшие методы DOM, CSS и jquery-подобные.

С помощью jsoup вы можете:

  • поиск и извлечение данных с использованием обхода DOM или селекторов CSS
  • манипулировать HTML-элементами, атрибутами и текстом

Вот его Javadoc: http://jsoup.org/apidocs/

1 голос
/ 12 сентября 2011

Я пытался Иерихон пару лет назад, было обманчиво просто использовать его API для анализа. Я использовал его для входа в почту Yahoo и получения контактов из адресной книги. Я уверен, что это может сделать гораздо больше, чем. На главной странице в качестве одной из функций упоминается одно из ваших требований " Превращение XHTML в простой текст ". Некоторые из функций, которые могут иметь отношение к вашим вопросам:

  • Встроенная функциональность для извлечения всего текста из разметки HTML
  • Начальная и конечная позиции в исходном документе всех проанализированных сегментов доступны, что позволяет изменять только выбранные сегменты документа без необходимости восстанавливать весь документ из дерева.

    И его бесплатный открытый источник. (Цитируя сайт: Таким образом, вы можете использовать его в коммерческих приложениях в соответствии с условиями, указанными в одном из этих лицензионных документов .)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...