【问题标题】:Perl code for Find and replace a tag value in XML用于在 XML 中查找和替换标记值的 Perl 代码
【发布时间】:2012-07-14 08:53:16
【问题描述】:

下面是我将使用的 XML:

<a>

<id>ABC</id>

<class />

<gender />

</a>

我想编写一个 Perl 代码来搜索标签“id”并将值“ABC”替换为“DEF”。

然而,上述 XML 的嵌套可以改变。所以我想制作一个通用代码,独立于其确切位置搜索标签“id”。

到目前为止,我能够获得可以替换 ABC 中的值的逻辑,但这会使我的代码静态标记“id”的位置。

#!usr/bin/perl
use warnings;
use XML::Simple;
use Spreadsheet::ParseExcel;
use Data::Dumper;
my $FileName = 'sample.xls';
my $xml_file = 'hello.xml';
$par=$ARGV[0];
my $xml = XMLin($xml_file,
    KeepRoot=>1,
    ForceArray=>1,);
$xml->{a}->[0]->{id}='DEF';
XMLout(
    $xml,
    KeepRoot =>1 ,
    NoAttr =>1,
    OutputFile => $xml_file,
        );
    }

【问题讨论】:

    标签: xml perl xml-simple


    【解决方案1】:

    XPath 能够找到节点而不需要知道树中的位置。

    use strictures;
    use XML::LibXML qw();
    my $dom = XML::LibXML->load_xml(string => <<'XML');
    <a>
    <id>ABC</id>
    <class />
    <gender />
    </a>
    XML
    
    for my $id ($dom->findnodes('//id[string()="ABC"]')) {
        $id->removeChildNodes;
        $id->appendText('DEF');
    }
    
    print $dom->toString
    

    【讨论】:

      【解决方案2】:

      一个简单的 XML::Twig 解决方案是:

      #!/usr/bin/perl
      
      use strict;
      use warnings;
      
      use XML::Twig;
      
      my $FILE= 'id.xml';
      
      XML::Twig->new( twig_handlers => { 'id[string()="ABC"]' => sub { $_->set_text( 'DEF'); } },
                      keep_spaces => 1,
                    )
                ->parsefile( $FILE)
                ->print_to_file( $FILE);
      

      只是为了好玩:高效的 XML::Twig 解决方案有点复杂,主要是因为您不能将 string() 条件与 twig_roots 一起使用。尽管如此,它还是相当紧凑的,而且它永远不会将整个文件加载到内存中。

      #!/usr/bin/perl
      
      use strict;
      use warnings;
      
      use XML::Twig;
      
      XML::Twig->new( twig_roots =>    { id => sub { $_->flush }, },
                      twig_handlers => { 'id[string()="ABC"]' => sub { $_->set_text( 'DEF'); } },
                      twig_print_outside_roots => 1,
                    )
                ->parsefile_inplace( 'id.xml');
      

      【讨论】:

        【解决方案3】:

        perl -i.bak -pe 's/abc/def/g' myfile.xml

        你会得到一个新文件 myfile.xml.bak

        【讨论】:

        • 不完整,因此不是一个非常有用的答案
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-07
        • 2017-02-13
        • 1970-01-01
        • 2012-09-13
        • 2014-04-18
        • 2016-10-31
        • 1970-01-01
        相关资源
        最近更新 更多