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