所以我在一个基本上有一个嵌套元素数组的 xml 文件中工作,每个元素都有很多嵌套属性:
<Export land_name="tx">
<Area>
<Location name="foo"
square_feet="10,000"
highway="I-35"/>
<Location name="dog"
square_feet="20,000"
highway="I-45"/>
</Area>
</Export>
我的目标是解析出属性(square_feet、highway、name)并将它们输出到 .csv 文件。我使用的是 XML::Simple,但我使用它的次数越多,我认为我使用的是错误的包。我的主要问题是解析嵌套属性的最佳控制结构是什么?我一直纠结于引用不存在的引用或数组引用。这是我到目前为止的代码:
use warnings;
use XML::Simple;
use Data::Dumper;
my $in = "XML_in.xml";
my $xml = XML::Simple->new(KeyAttr => [], ForceArray => [Device], KeepRoot => 1 );
my $Inv = $xml->XMLin($in);
print $Inv->{Export}->{Area}->{Location}->[0]->{name};
如果我的代码有误,是不是 KeyAttr
、ForceArra
y 或 keeproot
的使用不正确?
最佳答案
XML::Simple docs say not to use it in new code .这是一个很好的例子。相反,您可以使用 XML::Twig ,其中包含大量文档。
use strict;
use warnings;
use feature 'say';
use XML::Twig;
my $twig = XML::Twig->new(
twig_handlers => {
'Location' => sub {
my ( $twig, $elem ) = @_;
say join ';', map { $elem->att($_) } qw( name square_feet highway );
},
});
$twig->parse( \*DATA );
__DATA__
<Export land_name="tx">
<Area>
<Location name="foo"
square_feet="10,000"
highway="I-35"/>
<Location name="dog"
square_feet="20,000"
highway="I-45"/>
</Area>
</Export>
这为 <Location>
定义了一个处理程序标签,并从标签中抓取三个属性。然后您可以对它们做您想做的事。
因为您想将它们写入 CSV 文件,您可以使用 Text::CSV .将其设置在外部并调用它以在处理程序中写入内容。
另见:
关于xml - 使用 Perl 解析 XML 中嵌套属性的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31946412/