加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

Perl xml简单用于解析具有相同名称的节点

发布时间:2020-12-16 06:28:03 所属栏目:大数据 来源:网络整理
导读:我有以下xml文件 ?xml version="1.0"?!DOCTYPE pathway SYSTEM "http://www.kegg.jp/kegg/xml/KGML_v0.7.1_.dtd"pathway name="path:ko01200" org="ko" entry id="1" graphics name="one" type="circle" / /entry entry id="7" graphics name="one" type="re
我有以下xml文件

<?xml version="1.0"?>
<!DOCTYPE pathway SYSTEM "http://www.kegg.jp/kegg/xml/KGML_v0.7.1_.dtd">
<pathway name="path:ko01200" org="ko" >
    <entry id="1" >
        <graphics name="one" 
             type="circle" />
    </entry>
    <entry id="7" >
        <graphics name="one" 
             type="rectangle" />
        <graphics name="two" 
             type="rectangle"/>
    </entry>
</pathway>

我厌倦了使用xml简单解析它与下面的代码我被卡住,因为其中一个节点有2个图形元素.所以它抱怨.我假设我必须有另一个foreach循环的图形元素,但我不知道如何继续.

use strict;
use warnings;
use XML::Simple;
use Data::Dumper;

my $xml=new XML::Simple;
my $data=$xml->XMLin("file.xml",KeyAttr => ['id']);
print Dumper($data);    
foreach my $entry (   keys %{$data->{entry}} ) {
    print $data->{entry}->{$entry}->{graphics}->{type}."n";            
}

这是代码结果

$VAR1 = {
      'entry' => {
                 '1' => {
                        'graphics' => {
                                      'name' => 'one...','type' => 'circle'
                                    }
                      },'7' => {
                        'graphics' => [
                                      {
                                        'name' => 'one','type' => 'rectangle'
                                      },{
                                        'name' => 'two','type' => 'rectangle'
                                      }
                                    ]
                      }
               },'org' => 'ko','name' => 'path:ko01200'
    };
circle
Not a HASH reference at stack.pl line 12.

解决方法

XML :: Simple缺乏一致性,因为用户可以启用 strict mode,因此图形节点有时是哈希,有时是数组,具体取决于子元素的数量.

for my $entry ( keys %{$data->{entry}} ) {

    my $graphics = $data->{entry}{$entry}{graphics};
    $graphics = [ $graphics ] if ref $graphics eq "HASH";
    print "$_->{type}n" for @$graphics;
}

有更好的XML解析模块,请查看XML::LibXML

或者@RobEarl建议使用ForceArray参数:

XMLin("file.xml",KeyAttr => ['id'],ForceArray => [ 'graphics' ]);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读