0

我有一个包含大约 15 万条记录的 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。

4

2 回答 2

1

基于Nadav 的建议,但使用不同的解析器,这是一种使用及其XML::Twig模块的方法。它打印所有用逗号分隔的重复ID :

#!/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
于 2013-11-17T21:22:49.670 回答
1

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

最好的问候,纳达夫。

于 2013-11-17T21:05:54.930 回答