根文件夹中的不同子文件夹中有一堆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;
}
}发布于 2021-12-25 23:29:12
下面是一个示例,说明如何使用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://stackoverflow.com/questions/70483001
复制相似问题