根檔案夾的不同子檔案夾中有一堆 XML 檔案。其中一些具有以下內容。
XML-1
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Channels>
<Genre xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="News">
<CableType>XY-1</CableType>
<Name>C-SPAN</Name>
</Genre>
<displayName>C-SPAN Network</displayName>
<Genre xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Sports">
<CableType>XY-2</CableType>
<Name>Fox</Name>
</Genre>
<displayName>Fox Sports</displayName>
</Channels>
XML-2
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Channels>
<Genre xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="News">
<CableType>XY-1</CableType>
<Name>ABC</Name>
</Genre>
<displayName>ABC News</displayName>
<Genre xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Movies">
<CableType>XY-2</CableType>
<Name>HBO</Name>
</Genre>
<displayName>HBO Movies</displayName>
<Genre xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="News">
<CableType>XY-3</CableType>
<Name>CBS</Name>
</Genre>
<displayName>CBS News</displayName>
</Channels>
XML-3
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Channels>
<Genre xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="News">
<CableType>XY-1</CableType>
<Name>PBS</Name>
</Genre>
<displayName>PBS News</displayName>
<Genre xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Sports">
<CableType>XY-@</CableType>
<Name>ESPN</Name>
</Genre>
<displayName>ESPN Network</displayName>
</Channels>
目標是遍歷所有子檔案夾并決議 XML 并查找xsi:type值。大多數 XML 應該只包含一個 xsi:type=News。但在本例中,XML-2 中有 2 個xsi:type=News。
下面是一個 perl 腳本,到目前為止我可以想出它來遍歷所有子檔案夾并找到 XML 檔案并將其添加到陣列串列中。現在需要一些幫助來查找具有多個xsi:type=News 的XML 檔案。
my $dir = "C:\\perl_scripts";
use File::Find;
find(
{
wanted => \&findfiles,
},
$dir
);
sub findfiles
{
}
my @file_list;
find ( sub {
return unless -f; #Must be a file
return unless /\.xml$/; #Must end with `.xml` suffix
push @file_list, $File::Find::name;
}, $dir );
foreach my $title (@file_list) {
say $title;
}
如何獲得xsi:type=News > 1的總數然后在控制臺上列印?
對于以上 3 個 XML,它應該列印XML-2。
更新:
這是最終的代碼,
use feature qw(say);
use strict;
use warnings;
use XML::LibXML;
my $dir = "C:\\perl_scripts";
use File::Find;
find(
{
wanted => \&findfiles,
},
$dir
);
sub findfiles
{
}
my @file_list;
find ( sub {
return unless -f; #Must be a file
return unless /\.xml$/; #Must end with `.xml` suffix
push @file_list, $File::Find::name;
}, $dir );
foreach my $title (@file_list){
my $doc = XML::LibXML->load_xml(location => $title);
my %xsi_type;
for my $node ($doc->findnodes('//Genre')) {
$xsi_type{ $node->getAttribute('xsi:type') } ;
}
if ($xsi_type{News} > 1) {
print 'Found file with more than one xsi:type="News" ==> ';
say $title;
}
}
uj5u.com熱心網友回復:
下面是一個示例,說明如何XML::LibXML確定一個檔案是否有多個帶有 的標簽xsi:type="News":
use feature qw(say);
use strict;
use warnings;
use XML::LibXML;
my $xml = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Channels>
<Genre xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="News">
<CableType>XY-1</CableType>
<Name>ABC</Name>
</Genre>
<displayName>ABC News</displayName>
<Genre xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Movies">
<CableType>XY-2</CableType>
<Name>HBO</Name>
</Genre>
<displayName>HBO Movies</displayName>
<Genre xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="News">
<CableType>XY-3</CableType>
<Name>CBS</Name>
</Genre>
<displayName>CBS News</displayName>
</Channels>';
my $doc = XML::LibXML->load_xml(string => $xml);
my %xsi_type;
for my $node ($doc->findnodes('//Genre')) {
$xsi_type{ $node->getAttribute('xsi:type') } ;
}
if ($xsi_type{News} > 1) {
say 'Found file with more than one xsi:type="News"';
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/394520.html
標籤:perl
下一篇:決議正則運算式字串的正則運算式
