在VI中搜索XML文件中重复的行或重复的标记
问题描述:
我有一个XML文件,大约有150k条记录。该记录的格式如下所示:在VI中搜索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.
答
我相信这样做的正确方法是通过编写Perl脚本来处理rhe xml树并抛出有意义的错误。很可能这样的脚本会利用现有的Perl包来处理XML文件,如XML::Parser。
最好的问候, Nadav。
答
基于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