【问题标题】:Searching an XML file for duplicate lines or duplicate tags in VI在 VI 中搜索 XML 文件中的重复行或重复标签
【发布时间】:2013-04-03 13:09:06
【问题描述】:

我有一个包含大约 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。

【问题讨论】:

    标签: xml parsing search vi


    【解决方案1】:

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

    最好的问候, 纳达夫。

    【讨论】:

      【解决方案2】:

      基于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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多