我有以下XML:
<Product>
...
<TitleDetail>
<TitleType>01</TitleType>
<TitleElement>
<TitleElementLevel>01</TitleElementLevel>
<TitleText>This is the title I'm looking for</TitleText>
</TitleElement>
</TitleDetail>
...
</Product>
(它是ONIX,如果你有点好奇。)
我想提取01类型的标题。 我试过了:
say $dom->at('TitleDetail[TitleType="01"] > TitleElement > TitleText')
但这不起作用。看起来tag[attr=value]
语法实际上只适用于属性。
有没有一种简单的方法可以做我想要的事情?
答案 0 :(得分:5)
也许我的问题是我用锤子插入螺丝......
我喜欢Mojo :: DOM及其简单性,但也许它不太适合解析结构化XML,我应该使用XML :: XPath:
my $xp = XML::XPath->new(xml=>$xml);
say $xp->findvalue('//TitleDetail[TitleType=01]/TitleElement/TitleText');
这就是我需要的。
答案 1 :(得分:5)
可以使用Mojo :: DOM完成,但它很长。有几次Mojo :: Collections在那里,所以你需要得到第一个元素。
use Mojo::DOM;
my $dom = Mojo::DOM->new->xml(1)->parse($xml);
say $dom->find("TitleType")->grep(sub{ $_->text eq "01"})->first
->following("TitleElement")->first->at("TitleText")->text;