#!/usr/bin/perl
use warnings;
use strict;
use XML::LibXML;
use Carp;
use File::Find;
use File::Spec::Functions qw( canonpath );
use XML::LibXML::Reader;
my @ARGV ="c:/main/work";die "Need directories\n" unless @ARGV;
my $all="<DTCSpecification xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n";
find(
sub {
return unless ( /(_tr\.xml)$/ and -f );
extract_information();
return;
},
@ARGV
);
my $elem;
sub extract_information {
my $path = $_;
if ( my $reader = XML::LibXML::Reader->new( location => $path )) {
while ( $reader->nextElement( 'university' )) {
$elem = $reader->readOuterXml();
$all=$all.$elem;
}
}
return;
}
my $so="</DTCSpecification>";
$all= $all.$so;
my $doc = XML::LibXML->load_xml( string=>$all);
my %seen;
foreach my $uni ( $doc->findnodes('//university') )
my $name = $uni->find('Code');
print "'$name' duplicated\n",
$uni->unbindNode() if $seen{$name}++; # Remove if seen before
}
$all = $all.$doc->toString;
print $all;
第一次打印两次,重复信息,第二次打印,不重复。我尝试了这么多,但我无法理解为什么它打印两次。如何消除重复信息的打印。它也是根据元素“代码”删除节点所以当代码元素第二次出现时它的删除节点,但有时我在第二次出现时没有有用的信息。我该怎样克服这一点。你可以帮帮我吗。我非常抱歉一次又一次地要求并浪费你宝贵的时间。我的谦卑请求。
答案 0 :(得分:6)
目前尚不清楚为何需要XML::LibXML::Reader
。或许在这方面可以提供更多信息。
这是我如何做到的:
use strict;
use warnings;
use XML::LibXML;
my $file = 'universities.xml';
my $doc = XML::LibXML->load_xml( location => $file );
my %seen;
foreach my $uni ( $doc->findnodes('//university') ) { # 'university' nodes only
my $name = $uni->find('name');
print "'$name' duplicated\n",
$uni->unbindNode() if $seen{$name}++; # Remove if seen before
}
$doc->toFile('universities.xml'); # Print to file