xml - 有没有*简单*的方法来使用 XML::Simple 提取深度嵌套的值?

标签 xml perl

我正在使用 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/

相关文章:

SQL 服务器 : XPath to iterate through multiple elements and return values

android - Admob 广告横幅未显示所有设备

javascript - 由于 cookie 或其他原因,Chrome 不更新脚本和 rss?

javascript - 如何使用 Javascript 在浏览器中解析非 UTF8 XML?

linux - 如何从二进制垃圾中清除数据文件?

perl - 写入文件时奇怪地显示西里尔符号

xml - 节点 N 的 Go XML Unmarshalling 属性 X

multithreading - Perl 线程中的 join 会阻止 SIGALRM 吗?

perl - Net::SMTP - 停止工作,但我不确定为什么 [IO::Socket::SSL ?]

Perl-从输入字符串中获取第一个 "word"