我使用Twig_handlers处理带有 XML :: Twig 的1GB大文件,其中XML文件被分配到条目,其中每个Entry标记都包含其所有子标记。
我想开发一些机制来检查过去是否已经通过保存MD5摘要来检查每个条目,然后再次尝试运行代码以检查此条目是否在过去被执行并具有相同的摘要跳过它,目前我在Entry中做了这个机制,因为在检查摘要之前已经过了Twig条目,所以有人建议是否可以在构建Twig之前检查每个条目的摘要?
这里是我的代码简介:
XML::Twig->new(
twig_handlers => {
'Entry' => sub {
if(not exists_digest($_->outer_xml)){
#do somthing}
},
}
)->parsefile('myfile.xml');
答案 0 :(得分:1)
我不确定这是否是XML :: Twig的可用选项(可能是,我只是不知道)但您可以使用Digest::MD5和哈希自行完成此操作。使用哈希来记录您已经看到的MD5值:
use Digest::MD5 qw(md5);
my %exists_digest;
XML::Twig->new(
twig_handlers => {
'Entry' => sub {
my $md5 = md5($_->outer_xml);
if(!defined($exists_digest($md5)){
$exists_digest{$md5} = 1;
#do somthing
}
},
}
)->parsefile('myfile.xml');
答案 1 :(得分:1)
我没有看到任何简单的方法来做到这一点。获取条目文本的唯一方法是构建树枝。您可以使用的元素是否有任何ID?如果运行之间的id是常量,那么您不必重新计算MD5。但无论如何整个文件都将被解析。如果不解析每个元素,就无法跳转文件。