如何在Perl中过滤/缩小XML以忽略不需要的子元素?

时间:2016-01-21 17:42:51

标签: xml perl mojolicious

假设我开始使用以下XML结构(模拟):

<site defaultDomain="www.somedomain.com">
    <supported-locales>
        <locale id="sometext"/>
    </supported-locales>
    <next-child-of-site>
    ...
</site>

我正在使用Mojo::DOM并尝试仅获取id元素的<locale><supported-locales>元素作为<site>元素的子元素,并忽略# Parse XML my $dom = Mojo::DOM->new->xml(1)->parse($xml); for my $e ($dom->find('site[defaultDomain')->each) { say $e->children->join(); } 的所有其他子元素}

<supported-locales>

所以我做到了这一点,但我仍然坚持如何将孩子过滤到<locale>然后Mojo::DOM。建议?我是使用{{1}}进行XML处理的新手。

2 个答案:

答案 0 :(得分:3)

您可以直接使用子选择器查找localesite标记下的supported-locales标记:

#!/usr/bin/env perl

use strict;
use warnings;

use feature qw(say);
use Mojo::DOM;

my $xml = q{
<site defaultDomain="www.somedomain.com">
    <supported-locales>
        <locale id="sometext"/>
    </supported-locales>
    <next-child-of-site>
</site>
};
my $dom = Mojo::DOM->new->xml(1)->parse($xml);

for my $e ($dom->find('site > supported-locales > locale')->each) {
   say $e->{id};
}
# output: sometext

与往常一样,您应该use strict;use warnings;

答案 1 :(得分:2)

主要问题似乎是你有一个无效的CSS选择器site[defaultDomain。它没有平衡的方括号,所以它甚至不是合法的XPath表达式

这是一个程序,它使用您自己的数据来提供我认为您要求的内容

use strict;
use warnings 'all';
use feature 'say';

use Mojo;

my $xml = do {
    local $/;
    <DATA>;
};

my $dom = Mojo::DOM->new->xml(1);

$dom->parse($xml);

for my $e ($dom->find('supported-locales > locale')->each) {
    say $e->attr('id');
}

__DATA__
<site defaultDomain="www.somedomain.com">
  <supported-locales>
    <locale id="sometext"/>
  </supported-locales>
  <next-child-of-site>
  </next-child-of-site>
</site>

输出

sometext