首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl::Simple用于解析内部节点

Perl::Simple用于解析内部节点
EN

Stack Overflow用户
提问于 2013-10-01 14:05:19
回答 2查看 507关注 0票数 0

我想解析这里的XML文件,并打印internal元素的internal属性。

这是XML文件。

代码语言:javascript
复制
<?xml version="1.0"?>
<!DOCTYPE test SYSTEM "http://www.kegg.jp/kegg/xml/KGML_v0.7.1_.dtd">
<test name="A" >
    <node id="11" name="test1" >
        <internal id="111" name="A111"/>
     </node>
    <node id="12" name="B">
        <internal id="121" name="B121"/>
        <internal id="122" name="B122"/>

     </node>
</test>

下面是代码,当一个节点有两个内部属性时,它会失败。

代码语言:javascript
复制
use strict;
use warnings;

use XML::Simple;
use Data::Dumper;

my $xml=new XML::Simple; 
my $doc=$xml->XMLin("test.xml",KeyAttr => ['id']);

print Dumper($doc);

foreach my $node ( sort  keys %{$doc->{node}} ) {
    print $doc->{node}->{$node}->{internal}->{id}."\n";
} 

下面是翻斗的样子

代码语言:javascript
复制
$VAR1 = {
      'name' => 'test1',
      'node' => {
                '11' => {
                        'name' => 'A',
                        'internal' => {
                                      'name' => 'A111',
                                      'id' => '111'
                                    }
                      },
                '12' => {
                        'name' => 'B',
                        'internal' => {
                                      '122' => {
                                               'name' => 'B122'
                                             },
                                      '121' => {
                                               'name' => 'B121'
                                             }
                                    }
                      }
              }
    };
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-10-01 14:23:30

添加

代码语言:javascript
复制
ForceArray => [qw( node internal )]

代码:

代码语言:javascript
复制
my $doc = XMLin(\$xml,
   ForceArray => [qw( node internal )],
   KeyAttr    => [qw( id )],
);

print(Dumper($doc));

my $nodes = $doc->{node};
for my $node_key ( sort { $a <=> $b } keys %$nodes ) {
   my $node = $nodes->{$node_key};
   my $internals = $node->{internal};

   for my $internal_key ( sort { $a <=> $b } keys %$internals ) {
      print("$internal_key\n");

      # my $internal = $internals->{$internal_key};
      # print("$internal->{name}\n");
   }
}
票数 0
EN

Stack Overflow用户

发布于 2013-10-03 03:57:25

代码:

代码语言:javascript
复制
#!/usr/bin/perl -w
use strict;
use warnings;

use XML::Simple;
use Data::Dumper;

my $xml=new XML::Simple;
my $doc=$xml->XMLin(&get_str(),ForceArray => ['internal'],KeyAttr => 'id');
print Dumper($doc);
    
sub get_str {
  return qq#<?xml version="1.0"?>
<!DOCTYPE test SYSTEM "http://www.kegg.jp/kegg/xml/KGML_v0.7.1_.dtd">
<test name="A" >
    <node id="11" name="test1" >
        <internal id="111" name="A111"/>
     </node>
    <node id="12" name="B">
        <internal id="121" name="B121"/>
        <internal id="122" name="B122"/>

     </node>
</test>#;
}

输出:

代码语言:javascript
复制
$VAR1 = {
      'name' => 'A',
      'node' => {
                '11' => {
                        'name' => 'test1',
                        'internal' => {
                                      '111' => {
                                               'name' => 'A111'
                                             }
                                    }
                      },
                '12' => {
                        'name' => 'B',
                        'internal' => {
                                      '122' => {
                                               'name' => 'B122'
                                             },
                                      '121' => {
                                               'name' => 'B121'
                                             }
                                    }
                      }
              }
    };

原因

注1:“KeyAttr”的默认值是“name”、“key”、“id”。如果不希望输入折叠或输出展开,则必须将此选项设置为空列表以禁用该功能。 注2:如果您希望使用此选项,还应该启用ForceArray选项。如果没有'ForceArray',一个嵌套元素将被卷到一个标量中,而不是一个数组中,因此不会折叠(因为只有数组被折叠)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19118330

复制
相关文章

相似问题

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