【问题标题】:How can I anonymise XML data for selected tags?如何匿名化选定标签的 XML 数据?
【发布时间】:2010-10-08 15:01:45
【问题描述】:

我的问题如下:

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

我确切知道要匿名 XML 中的哪些标签。

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

其中alphabeta 指代其中的任何字符,这些字符也将被散列,可能使用MD5 之类的算法。

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

我希望,我对我的问题足够清楚。我如何做到这一点?

【问题讨论】:

    标签: python xml perl anonymize


    【解决方案1】:

    您必须在 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)
    

    【讨论】:

      【解决方案2】:

      使用正则表达式确实很危险,除非你确切知道文件的格式,否则用正则表达式很容易解析,而且你确定它以后不会改变。

      否则,您确实可以使用 XML::Twig,如下所示。另一种方法是使用 XML::LibXML,尽管文件可能有点大,无法将其完全加载到内存中(同样,也许不是,现在内存很便宜)所以你可能不得不使用拉模式,我不太了解。

      紧凑的 XML::Twig 代码:

      #!/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;
      

      【讨论】:

      • 我正要建议 XML::Twig。只转换您需要接触的 XML 树的那部分,而留下其余部分是非常容易的。 :)
      【解决方案3】:

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

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

      【讨论】:

      • 一个 50 MB 的文件对于 DOM 处理来说可能有点多,这取决于内存中数据结构的扩展系数。至少可能需要一段时间才能得出任何结果。流式处理或拉式处理可能是一个更好的主意。
      【解决方案4】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-03-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多