EDIT:
OK теперь, когда я понимаю, это может пойти по тэгам Я думаю, что я понимаю трудность здесь.
Единственный алгоритм, который я могу здесь придумать, - это пройти дерево XML, читающее текстовые фрагменты, которые ищут ваш матч, - вам нужно будет сделать это, сопоставляя себя персонажем символом через несколько узлов. Трудность, конечно, не munge дерева в процессе ...
Вот как я бы это сделать:
Создать ходунки ходить к дереву XML. Всякий раз, когда вы думаете, что нашли начало совпадения строк, сохраните все текущие родительские узлы. Когда (и если) вы найдете конец своего совпадения строк, проверьте, совпадает ли сохраненный узел с родителем конечного узла. Если они одинаковы, тогда можно безопасно модифицировать дерево.
Пример док:
<doc>This is a an <b>example text I made up</b> on the spot! Nutty.</doc>
Тест 1: Match: Пример текста
Ходок будет идти вперед, пока он не найдет «е» в примере, и было бы сохранить родительский узел (<b>
узел) и продолжайте идти до тех пор, пока не найдет конец text
, где он будет проверять, был ли он все еще в том же ссылочном узле <b>
, что и есть, поэтому он является совпадением, и вы можете пометить его или что-то еще.
Тест 2: Match: пример
Ходок будет первым ударил 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
После того, как вы знаете, где узел, который должен содержать ваш матч, I» m не уверен, что может сделать, потому что вы не знаете, как вы можете определить индекс внутри текста, где это необходимо из регулярного выражения ... Возможно, у кого-то есть регулярное выражение, которое вы можете изменить ...
отлично, звучит так, как будто вы его поняли. в чем вопрос? –
Почему бы вам просто не использовать XLST, это именно то, что было предназначено для этого. –
Вы просите больших проблем, пытаясь разобрать XML с помощью регулярных выражений. Ник прав: используйте XSLT, а затем примените вашу замену к тексту элемента. –