2013-04-11 77 views
0

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

回答

1

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

最好的问候, Nadav。

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