编辑:
好的,现在我明白这可以跨越标签,我想我理解这里的困难。
我在这里能想到的唯一算法是遍历 XML 树,读取文本部分以搜索您的匹配项——您需要在多个节点上逐个字符地匹配自己。困难当然是在这个过程中不要把树弄脏……
这是我的做法:
创建一个步行器以步行到 XML 树。每当您认为已找到字符串匹配的开始时,请保存当前父节点的任何内容。何时(以及是否)找到字符串匹配的结尾,检查保存的节点是否与结尾节点的父节点相同。如果它们相同,那么修改树是安全的。
示例文档:
<doc>This is a an <b>example text I made up</b> on the spot! Nutty.</doc>
测试 1:匹配:示例文本
walker 会一直走下去,直到找到示例中的“e”,它会保存父节点(<b>
node )并继续行走,直到找到text
它会检查它是否仍在同一个参考节点<b>
中的终点是的,所以它是匹配的,你可以用它或其他任何东西来标记它。
测试 2:匹配:一个例子
walker 会先点击a
并迅速拒绝它,然后点击an
并保存<doc>
节点。它将继续匹配example
文本,直到它意识到该示例的父节点是<b>
而不是<doc>
此时匹配失败并且没有安装节点。
实施1:
如果您只匹配纯文本,那么使用 Java(SAX 或其他东西)的简单匹配器似乎是一种方法。
实施2:
如果匹配的输入是正则表达式本身,那么您将需要一些非常特别的东西。我知道没有引擎可以肯定在这里工作,你可以做的是写一些丑陋的东西来做......也许某种递归walker会将XML树分解成越来越小的节点-sets,在每个级别搜索完整的文本...
非常粗糙(不工作)的代码:
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
一旦您知道应该包含匹配项的节点在哪里,我不确定可以做什么,因为您不知道如何从正则表达式中找出文本中需要它的索引...也许有人有一个正则表达式,你可以修改......