msc*_*cha 4 xml perl dom mojolicious
我有以下XML:
<Product>
...
<TitleDetail>
<TitleType>01</TitleType>
<TitleElement>
<TitleElementLevel>01</TitleElementLevel>
<TitleText>This is the title I'm looking for</TitleText>
</TitleElement>
</TitleDetail>
...
</Product>
Run Code Online (Sandbox Code Playgroud)
(如果你很好奇,那就是ONIX.)
我想提取01类型的标题.我试过:
say $dom->at('TitleDetail[TitleType="01"] > TitleElement > TitleText')
Run Code Online (Sandbox Code Playgroud)
但这不起作用.看起来tag[attr=value]
语法真的只适用于属性.
有一种简单的方法可以做我想要的吗?
也许我的问题是我用锤子插入螺丝......
我喜欢Mojo :: DOM及其简单性,但也许它不太适合解析结构化XML,我应该使用XML :: XPath:
my $xp = XML::XPath->new(xml=>$xml);
say $xp->findvalue('//TitleDetail[TitleType=01]/TitleElement/TitleText');
Run Code Online (Sandbox Code Playgroud)
这就是我需要的.
它可以用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;
Run Code Online (Sandbox Code Playgroud)