2009-02-19 40 views
2

我的问题如下:如何匿名处理选定标记的XML数据?

我必须读取一个大的XML文件,50 MB;并匿名与私人问题有关的一些标签/字段,如姓名地址,电子邮件,电话号码等...

我确切知道XML中的哪些标签将被匿名化。

s|<a>alpha</a>|MD5ed(alpha)|e; 
s|<h>beta</h>|MD5ed(beta)|e; 

alpha哪里和beta指内的任何字符,这也将被散列,使用可能的算法等MD5

我只会转换标签值,而不是标签本身。

我希望我对自己的问题有足够的了解。我如何实现这一目标?

回答

3

使用正则表达式实际上是危险的,除非您确切地知道文件的格式,用正则表达式很容易解析,并且您确信它将来不会改变。

否则,你确实可以使用XML :: Twig,如下所示。另一种方法是使用XML :: LibXML,尽管该文件可能有点大,可以将其全部加载到内存中(如果可能,内存很便宜),所以您可能需要使用拉模式,即I不太了解。

紧凑XML ::嫩枝代码:

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Twig; 
use Digest::MD5 'md5_base64'; 

my @tags_to_anonymize= qw(name surname address email phone); 

# the handler for each element ($_) sets its content with the md5 and then flushes 
my %handlers= map { $_ => sub { $_->set_text(md5_base64($_->text))->flush } } @tags_to_anonymize; 

XML::Twig->new(twig_roots => \%handlers, twig_print_outside_roots => 1) 
     ->parsefile("my_big_file.xml") 
     ->flush; 
4

底线:不要使用正则表达式解析XML。

改为使用您的语言的DOM解析库,如果您知道需要匿名化的元素,请使用XPath抓取它们并通过设置其innerText/innerHTML属性(或任何您的语言称为它们)来散列它们的内容。

+0

甲50 MB文件可能会有点多的DOM处理,根据在存储器中的数据结构的扩展因子。至少可能需要一段时间才能有结果出来。流或拉处理可能是一个更好的主意。 – mirod 2009-02-20 13:33:24

6

你必须在Python中做如下的事情。

import xml.etree.ElementTree as xml # or lxml or whatever 
import hashlib 
theDoc= xml.parse("sample.xml") 
for alphaTag in theDoc.findall("xpath/to/tag"): 
    print alphaTag, alphaTag.text 
    alphaTag.text = hashlib.md5(alphaTag.text).hexdigest() 
xml.dump(theDoc) 
3

正如Welbog所说,不要试图用正则表达式来解析XML。你最终会后悔的。

可能最简单的方法是使用XML::Twig。它可以用块处理XML,这使您可以处理非常大的文件。

另一种可能性是使用SAX,尤其是XML::SAX::Machines。我从来没有真正使用过,但它是一个面向流的系统,所以它应该能够处理大文件。缺点是您可能需要编写更多代码来收集每个您关心的标记(XML :: Twig将为您收集该文本)的文本。

+0

Twig的好教程是http://xmltwig.com/ – 2009-02-19 16:58:01

+0

实际上它现在在http://xmltwig.org/xmltwig/ – mirod 2012-02-28 18:08:14