gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 18:09:00 25 4
gpt4 key购买 nike

我有以下 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 , 所以 graphics节点有时是散列,有时是数组,具体取决于子元素的数量。

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' ]);

关于Perl xml简单用于解析具有相同名称的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19089242/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com