用Python查找和链接XML中重复字符串的最简单方法



我必须解析一个包含大量字符串值的XML文件。例如:

<value>Foo</value>
<value>Bar</value>
<value>Baz</value>
<value>Foo</value>

其中有些是平等的。有多个重复出现的字符串,而不是像上面的例子那样只有一个。因此,我想检测这样的值,并将它们与XLink链接:在循环字符串的一个实例上创建引用(不必在第一个实例上),并链接其余的(我可以使用UUID),如下图所示:

<value id="D5494447-A010-4F81-9DDA-E5DFFBD616FF">Foo</value>
<value>Bar</value>
<value>Baz</value>
<value href="#D5494447-A010-4F81-9DDA-E5DFFBD616FF"/>

我是从XLink开始的,所以上面的内容可能没有意义。如果这不可能,另一种可能性是我可以创建一个包含以下值的字典:

{'D5494447-A010-4F81-9DDA-E5DFFBD616FF' : 'Foo'}

然后以某种方式将它们放入XML中。实现这些目标的最简单方法是什么?我不太关心最有效的方法,只要方法正确且易于实现,因为我是Python初学者,而不是计算机科学家,计算复杂性不是问题。解析和编写XML不是问题(我用lxml解决了这个问题),所以这里的问题只是关于检测重复出现的字符串及其链接。

一种方法是维护您以前看到的所有字符串的dict(从任意键到值的映射)。因此,让我们假设您处于变量val中的值所在的位置,并且存在一个最初为空的dictvaldict。你需要的代码是这样的:

import uuid
if val in valdict: # We have seen this reference before
print '<value href="#%s"/>' % valdict[val]
else:              # We need to add this reference
valdict[val] = str(uuid.uuid4()).upper()
print '<value id="%s">%s</value>' % (valdict[val], val)

我并不建议使用这种简单的方法来形成XML-iself,但听起来您已经做好了处理这方面问题的准备。

最新更新