我有一个大约有150k条记录的XML文件。记录的格式如下所示:
<product>
<product_id>1</product_id>
<product_name>ABC1</product_name>
</product>
<product>
<product_id>2</product_id>
<product_name>ABC2</product_name>
</product>
<product>
<product_id>3</product_id>
<product_name>ABC3</product_name>
</product>
<product>
<product_id>3</product_id>
<product_name>ABC4</product_name>
</product>
<product>
<product_id>4</product_id>
<product_name>ABC5</product_name>
</product>
<product>
<product_id>5</product_id>
<product_name>ABC6</product_name>
</product>
<product>
<product_id>6</product_id>
<product_name>ABC7</product_name>
</product>
当我加载上面的文件时,我得到唯一的约束违规错误 - 意味着某些记录使用相同的product_id 哪个数据库不允许。
VI中是否有更简单的方法来解析文件以了解/显示使用非唯一ID的所有产品(使用product_id标记)。举个例子, 上面的示例有两个产品使用相同的唯一ID 3.
答案 0 :(得分:1)
我相信正确的方法是编写一个Perl脚本来处理rhe xml树并抛出有意义的错误。很可能这样的脚本会利用现有的Perl包处理XML文件,例如XML::Parser。
最诚挚的问候, Nadav。
答案 1 :(得分:1)
基于Nadav's建议,但使用不同的解析器,这是使用perl及其XML::Twig
模块的方法。它打印以逗号分隔的所有重复的 ids :
#!/usr/bin/env perl
use warnings;
use strict;
use XML::Twig;
my (@rep_ids, %id);
XML::Twig->new(
twig_roots => {
'product/product_id' => sub {
my $id = $_->text_only;
if ( exists $id{ $id } ) {
push @rep_ids, $id;
}
$id{ $id } = 1;
},
},
)->parsefile( shift );
printf qq|%s\n|, join q|,|, @rep_ids;
像以下一样运行:
perl script.pl xmlfile
产量:
3