EDIT:
Хорошо, теперь, когда я понимаю, что это может идти по тегам, я думаю, что я понимаю сложность здесь.
Единственный алгоритм, который я могу придумать здесь, - это пройтись по дереву XML, читая фрагменты текста в поисках вашего соответствия - вам нужно будет выполнить это, сопоставляя себя символ за символом по нескольким узлам. Сложность, конечно же, состоит в том, чтобы не прогуливать дерево в процессе ...
Вот как бы я это сделал:
Создайте обходчика, чтобы пройти к дереву XML. Всякий раз, когда вы думаете, что нашли начало совпадения строки, сохраните любой текущий родительский узел. Когда (и если) вы найдете конец вашего совпадения строк, проверьте, совпадает ли сохраненный узел с родительским узлом конечного узла. Если они одинаковы, то модифицировать дерево безопасно.
Пример документа:
<doc>This is a an <b>example text I made up</b> on the spot! Nutty.</doc>
Тест 1:
Совпадение: пример текста
Ходок будет идти, пока он не найдет "e" в примере, и он сохранит родительский узел (<b>
узел) и продолжит идти, пока не найдет конец text
, где он проверит, чтобы увидеть, он все еще находился в том же ссылочном узле <b>
, что и есть, так что это совпадение, и вы можете пометить его или как угодно.
Тест 2:
Совпадение: пример
Ходок сначала нажмет a
и быстро отклонит его, затем нажмет an
и сохранит узел <doc>
. Он будет продолжать совпадать с текстом example
, пока не поймет, что родительский узел этого примера равен <b>
, а не <doc>
, и в этот момент совпадение не будет выполнено, и ни один узел не будет установлен.
Реализация 1:
Если вы сопоставляете только прямой текст, то простой способ сопоставления, использующий Java (SAX или что-то в этом роде), кажется вам подходящим вариантом.
Реализация 2:
Если соответствующий ввод - это само регулярное выражение, то вам понадобится что-то особенное. Я не знаю ни одного движка, который мог бы работать здесь наверняка, и то, что вы могли бы могли бы сделать, это написать что-то уродливое, чтобы сделать это ... Может быть, какой-то рекурсивный ходок, который сломал бы XML дерево в меньшие и меньшие наборы узлов, ища полный текст на каждом уровне
Очень грубый (нерабочий) код:
def search(raw, regex):
tree = parseXml(raw)
text = getText(tree)
if match(text, regex):
def searchXML(tree, regex):
text = getFlatText(tree)
if match(text, regex): # check if this text node might match
textNodes = getTextNodes(tree)
for (tn : textNodes): # check if its contained in a single text node
if match(tn, regex):
return tn
xmlnodes = getXMLNodes(tree)
for (xn : xmlnodes): # check if any of the children contain the text
match = searchXML(xn, regex)
if match
return match
return tree # matches some combination of text/nodes at this level
# but not at a sublevel
else:
return None # no match in this subtree
Как только вы узнаете, где находится узел, который должен содержать ваше совпадение, я не уверен, что можно сделать, потому что вы не знаете, как определить индекс внутри текста, где он необходим из регулярного выражения. Может быть, у кого-то есть регулярное выражение, которое вы можете изменить ...