Как я могу анонимизировать данные XML для выбранных тегов? - PullRequest
2 голосов
/ 19 февраля 2009

Мой вопрос таков:

Мне нужно прочитать большой XML-файл, 50 МБ; и анонимизировать некоторые теги / поля, относящиеся к личным вопросам, такие как имя, фамилия, адрес, адрес электронной почты, номер телефона и т. д. *

Я точно знаю, какие теги в XML должны быть анонимными.

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

, где alpha и beta относятся к любым символам внутри, которые также будут хэшироваться, используя, вероятно, такой алгоритм, как MD5 .

Я буду конвертировать только значение тега, а не сами теги.

Надеюсь, я достаточно ясно о своей проблеме. Как мне этого добиться?

Ответы [ 5 ]

6 голосов
/ 19 февраля 2009

Вы должны сделать что-то вроде следующего в 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)
4 голосов
/ 19 февраля 2009

Использование регулярных выражений действительно опасно, если вы точно не знаете формат файла, его легко проанализировать с помощью регулярных выражений, и вы уверены, что он не изменится в будущем.

В противном случае вы действительно можете использовать 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;
4 голосов
/ 19 февраля 2009

Итог: не анализировать XML с помощью регулярных выражений.

Вместо этого используйте библиотеки синтаксического анализа DOM вашего языка, и, если вы знаете элементы, которые необходимо анонимизировать, захватите их с помощью XPath и хешируйте их содержимое, задав для них свойства innerText / innerHTML (или как их называет ваш язык).

3 голосов
/ 19 февраля 2009

Как сказал Велбог, не пытайтесь анализировать XML с помощью регулярных выражений. Вы пожалеете об этом в конце концов.

Вероятно, самый простой способ сделать это - использовать XML :: Twig . Он может обрабатывать XML порциями, что позволяет обрабатывать очень большие файлы.

Другой возможностью было бы использование SAX , особенно с XML :: SAX :: Machines . Я сам никогда этим не пользовался, но это потоково-ориентированная система, поэтому она должна обрабатывать большие файлы. Недостатком является то, что вам, вероятно, придется написать больше кода для сбора текста внутри каждого интересующего вас тега (где XML :: Twig будет собирать этот текст для вас).

0 голосов
/ 03 мая 2019

Мы открыли наш инструмент Paranoid , который позволяет маскировать отдельные элементы XML или все элементы в отдельном файле XML или папке файлов XML.

Он также работает с большими файлами XML посредством буферизации. Это также работает с JSON

Параноик написан на Python

...