我正在使用 Perl 的 XML::Simple解析深层嵌套的 XML,并希望提取大约 4 层以下的一小部分元素列表:
A
B
C
D1
D2
D3
理想情况下,如果可能的话,我想在输入步骤中执行此操作。像这样:
my @list = XMLin($xml, { SomeAttribute => 'ButWhat?' });
结果和我一样:
@list = ('D1', 'D2', 'D3')
有可能吗?或者只是没那么“简单”?
最佳答案
假设您在内存中的数据如下所示:
my $parsed = {
A => {
B => {
C => [ qw/here is your list/ ],
},
},
};
然后您可以使用 my @list = @{ $parsed->{A}{B}{C} }
获取您的列表。
这就是你想要做的吗?
编辑:考虑到一些评论,也许你想要 Data::Visitor::Callback . 然后您可以提取所有数组,如:
my @arrays;
my $v = Data::Visitor::Callback->new(
array => sub { push @arrays, $_ },
);
$v->visit( $parsed_xml );
运行之后,\@arrays 将是一个引用列表 任意深度嵌套数组。
最后,如果你只有一个属性名,想搜索 匹配 XML 节点,您真的需要 XPath:
use XML::LibXML;
my $parser = XML::LibXML->new;
my $doc = $parser->parse_string( $xml_string );
# yeah, I am naming the variable data. so there.
my @data = map { $_->textContent } $doc->findnodes('//p[@id="foo"]');
无论如何,TMTOWTDI。如果您正在使用 XML,并且想做 一些复杂的东西,XML::Simple 很少是正确的答案。我用 XML::LibXML 适用于一切,因为它几乎总是更容易。
还有一件事,你可能想要 Data::DPath .它让 你“XPath”一个内存中的 perl 数据结构:
关于xml - 有没有*简单*的方法来使用 XML::Simple 提取深度嵌套的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/540897/