我有一个完整的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 $!";
}
答案 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吗?