Я ищу библиотеку / инфраструктуру 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.