xml - 使用 Perl 解析 XML 中嵌套属性的最佳方法是什么?

标签 xml perl parsing attributes elements

所以我在一个基本上有一个嵌套元素数组的 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};

如果我的代码有误,是不是 KeyAttrForceArray 或 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/

相关文章:

java - 如何获取drawable中图片的照片名称?

java - 需要有关将元素属性转换为元素的 xslt 逻辑的帮助

perl - 无法在 Windows 平台中使用 Perl 列出包含空间的目录

perl - 使用 Perl 获取文件的祖父目录

xml - 警告 : Can not parse XML library list; XML support was disabled at compile time error

javascript - 通过ajax请求填充js变量的正确方法

perl - 在 Perl 模板工具包中显示时间增量

android - 如何从 json 数组中检索数据

parsing - 使用选项类型而不是递归下降解析器的异常?

xmlns 声明破坏了我的 xPath 过滤器