繁体   English   中英

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

[英]How can I extract values from an XML file with Perl's XML::Simple?

考虑到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”和表name =“ propertytables”#输出B1,B2

XML :: Simple是用于此角色的唯一模块并不是真的。 对于这样的事情,我将XML :: LibXML与XPath一起使用。

但是,如果要使用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>
$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' ] );

检查结构以查看路径。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM