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

时间:2014-02-22 17:57:38

标签: python xml search indexing xlink

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

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

其中一些是平等的。有多个重复的字符串,而不仅仅是上面示例中的一个。因此,我想检测这些值,并将它们与XLink链接:在一个重复字符串的一个实例上创建一个引用(不必在第一个),并链接其余的(我可以使用) UUIDs),就像这里:

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

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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,但听起来你已经做好了充分准备来处理这方面的事情。