假设我开始使用以下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处理的新手。
答案 0 :(得分:3)
您可以直接使用子选择器查找locale
和site
标记下的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