首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Perl中的XML获取XSI类型

从Perl中的XML获取XSI类型
EN

Stack Overflow用户
提问于 2021-12-25 22:03:16
回答 1查看 171关注 0票数 1

根文件夹中的不同子文件夹中有一堆XML文件。其中有些内容如下。

XML-1

代码语言:javascript
运行
复制
  <?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

代码语言:javascript
运行
复制
    <?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

代码语言:javascript
运行
复制
  <?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文件。

代码语言:javascript
运行
复制
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

更新:

这是最后的代码

代码语言:javascript
运行
复制
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;
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-12-25 23:29:12

下面是一个示例,说明如何使用XML::LibXML来确定一个文件是否有多个带有xsi:type="News"的标记:

代码语言:javascript
运行
复制
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"';
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70483001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档