2009-02-19 50 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