考虑到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”和tables 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>

09-25 22:27
查看更多