【问题标题】:Perl XML edit for multi-register nested tags多寄存器嵌套标签的 Perl XML 编辑
【发布时间】:2012-12-29 16:49:09
【问题描述】:

我有一个嵌套的 XML 标记,需要在产品 XML 中为 ExternalId 附加 PF

输入 XML:

<Products>
    <Product>
      <ExternalId>317851</ExternalId>
    </Product>
    <Product>
      <ExternalId>316232</ExternalId>
    </Product>
    <Product>
      <ExternalId>13472</ExternalId>
    </Product>
</Products>

想要的输出结果:

   <Products>
        <Product>
          <ExternalId>PF317851</ExternalId>
        </Product>
        <Product>
          <ExternalId>PF316232</ExternalId>
        </Product>
        <Product>
          <ExternalId>PF13472</ExternalId>
        </Product>
    </Products>

我尝试过使用 XML Simple。

【问题讨论】:

  • StackOverflow.com上有很多解析XML的问题,你看过了吗?
  • 是的,我环顾四周并测试了其中的一些。
  • 那么也许你应该选择那些测试中最成功的一个,然后问问为什么它不起作用。
  • 我已经尝试了下面的链接stackoverflow.com/questions/2970845/…(因为我有数组)并按照下面的链接stackoverflow.com/questions/1327720/…输出。 XML 保持不变,无法看到 ExteralId 值的变化。

标签: perl xml-parsing


【解决方案1】:

使用模块XML::Twig的一种方式。

script.pl的内容:

#!/usr/bin/env perl

use warnings;
use strict;
use XML::Twig;

{
    my $twig = XML::Twig->new( 

        twig_handlers => {
            'Product/ExternalId' => sub {
                $_->prefix( 'PF' );
            }   
        },  

        pretty_print => 'indented',

    )->parsefile( shift )->print;
}

像这样运行它:

perl-5.14.2 script.pl xmlfile

产生:

<Products>                                                                                                                                                                                                                                   
  <Product>                                                                                                                                                                                                                                  
    <ExternalId>PF317851</ExternalId>                                                                                                                                                                                                        
  </Product>                                                                                                                                                                                                                                 
  <Product>                                                                                                                                                                                                                                  
    <ExternalId>PF316232</ExternalId>                                                                                                                                                                                                        
  </Product>
  <Product>
    <ExternalId>PF13472</ExternalId>
  </Product>
</Products>

更新:要打印到文件,我添加了两项修改,一行用于打开输出文件,以及将输出文件的文件句柄作为参数打印的print 方法

结果:

#!/usr/bin/env perl

use warnings;
use strict;
use XML::Twig;

die qq|Usage: perl $0 <input-xml> <output-xml>\n| unless @ARGV == 2;

open my $ofh, '>', pop or die qq|ERROR: Cannot open output file\n|;

{
    my $twig = XML::Twig->new( 

        twig_handlers => {
            'Product/ExternalId' => sub {
                $_->prefix( 'PF' );
            }   
        },  

        pretty_print => 'indented',

    )->parsefile( shift )->print( $ofh );
}

它的调用方式如下:

perl-5.14.2 script.pl xmlfile outfile

【讨论】:

  • 谢谢 Birei,我没有安装 Twig,我可用的库是 XML::LibXML、XML::NamespaceSupport、XML::Parser、XML::RegExp、XML::SAX、XML: :简单
  • 我已经安装了 XML::Twig 并且可以在日志中看到结果,我们如何将结果写入文件?
  • perl script.pl input &gt; output 也许?
  • 我已尝试并收到警告(在 void 上下文中无用使用数字 gt (>)),我可以看到输出正在写入日志文件而不是文件
  • @user1970783:我认为@TLP 意味着从shell 运行该命令。在perl 脚本之外。
猜你喜欢
  • 1970-01-01
  • 2012-05-04
  • 2011-09-24
  • 1970-01-01
  • 2011-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-19
相关资源
最近更新 更多