根据XML标记内容重命名XML文件

时间:2016-05-05 14:04:45

标签: xml perl

我有一个完整的XML文件夹,看起来像这样:

<Index xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="$APTCUSTOM/doctypes/index-capture/index-capture.xsd">
  <Metadata>
    <DeskEd/>
    <PublicationDate/>
    <History/> 
  </Metadata>
  <CasesReported>
    <IxEntryCR>
      <CaseM>
        <IxCard/>
        <CaseName>Property Investments (Development) Ltd v Byfield Building Services Ltd</CaseName>
        <NameMod/>
        <AltName/>
      </CaseM>

我想要做的是使用Perl脚本根据每个文件中<CaseName></CaseName>标记的内容重命名所有文件。因此,在此示例中,我想将文件重命名为Property_Investments_(Development)_Ltd_v_Byfield_Building_Services_Ltd.xml

我找到的最接近的解决方案是在此帖子Rename files according to xml tag contents中。但是,我无法让它发挥作用。

我对Perl很新,并且感觉我做了一些根本错误的事情。我们将非常感激地接受正确方向的转向!

我一直在使用的代码如下:

#!/usr/bin/perl

use XML::Simple;
for $file ( @ARGV[ 0 .. $#ARGV ] ) {

my $ref = XMLin($file);

$new_name = $ref->{'CaseM'}->{'CaseName'};

rename $file, "$new_name.xml" || warn "couldn't rename $file $!";
}

1 个答案:

答案 0 :(得分:0)

不要使用XML :: Simple。甚至它的文档也告诉你。

以下是XML::LibXML如何解决您的问题(以文件名作为参数运行):

#!/usr/bin/perl
use warnings;
use strict;

use XML::LibXML;

my $file = shift;
my $dom = 'XML::LibXML'->load_xml(location => $file);
my $name = $dom->findvalue('/Index/CasesReported/IxEntryCR/CaseM/CaseName');
$name =~ s/ /_/g;
rename $file, "$name.xml" or die "Can't rename to $name.\n";

你确定文件中只有一个CaseName吗?