在VI中搜索XML文件中的重复行或重复标记

时间:2013-04-11 11:03:01

标签: xml parsing search vi

我有一个大约有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.

2 个答案:

答案 0 :(得分:1)

我相信正确的方法是编写一个Perl脚本来处理rhe xml树并抛出有意义的错误。很可能这样的脚本会利用现有的Perl包处理XML文件,例如XML::Parser

最诚挚的问候, Nadav。

答案 1 :(得分:1)

基于Nadav's建议,但使用不同的解析器,这是使用及其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