如何使用Perl的XML :: Simple从XML文件中提取值?

时间:2010-09-22 15:21:28

标签: xml perl

考虑到XML :: Simple是唯一可以使用的模块,我无法从XML中检索值。结构如下:

<testxml>
    <dev>
        <A>
            <tables>
                <datatables>
                    <table>a1</table>
                    <table>a2</table>
                    <table>a3</table>
                </datatables>
                <propertytables>
                    <table>A1</table>
                    <table>A2</table>
                </propertytables>
            </tables>
        </A>
        <B>
            <tables>
                <datatables>
                    <table>b1</table>
                    <table>b2</table>
                </datatables>
                <propertytables>
                    <table>B1</table>
                    <table>B2</table>
                </propertytables>
            </tables>
        </B>
    </dev>
</testxml>

XMLOut是:

<opt>
  <dev name="A">
    <tables name="datatables">
      <table>a1</table>
      <table>a2</table>
      <table>a3</table>
    </tables>
    <tables name="propertytables">
      <table>A1</table>
      <table>A2</table>
    </tables>
  </dev>
  <dev name="B">
    <tables name="datatables">
      <table>b1</table>
      <table>b2</table>
    </tables>
    <tables name="propertytables">
      <table>B1</table>
      <table>B2</table>
    </tables>
  </dev>
</opt>

如何检索表格数组说明这种情况:
dev name =“B”,表名=“propertytables”#输出B1,B2

2 个答案:

答案 0 :(得分:3)

XML :: Simple是唯一用于此角色的模块。对于这样的事情,我会使用带有一点XPath的XML :: LibXML。

但是如果你想使用XML :: Simple,我发现最好的方法是使用Data :: Dumper转储XML :: Simple构建的数据结构,并使用该转储来计算出最佳的行走方式结构。在你的情况下,它非常简单。

#!/usr/bin/perl

use strict;
use warnings;

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

my $xml = do { local $/; <DATA> };

my $doc = XMLin($xml);

# print Dumper $doc;

my $dev = 'B';
my $table = 'propertytables';

foreach (@{$doc->{dev}{$dev}{tables}{$table}{table}}) {
  print "$_\n";
}

__END__
<opt>
  <dev name="A">
    <tables name="datatables">
      <table>a1</table>
      <table>a2</table>
      <table>a3</table>
    </tables>
    <tables name="propertytables">
      <table>A1</table>
      <table>A2</table>
    </tables>
  </dev>
  <dev name="B">
    <tables name="datatables">
      <table>b1</table>
      <table>b2</table>
    </tables>
    <tables name="propertytables">
      <table>B1</table>
      <table>B2</table>
    </tables>
  </dev>
</opt>

答案 1 :(得分:2)

$ref->{dev}{B}{tables}{propertytables}{table}

将是参考和

@{ $ref->{dev}{B}{tables}{propertytables}{table} }

将是列表。

但确实这样做

my $ref = XMLin( $some_source );
use Smart::Comments;
### $ref 

# ... OR ...

use Data::Dumper;
print Data::Dumper->Dump( [ $ref ], [ '*ref' ] );

检查结构以查看路径是什么。