在 Perl 中使用 Mojo::DOM in XML 模式,我如何匹配子标签的内容?

In Perl using Mojo::DOM in XML mode, how do I match on contents of subtags?

我有以下 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] 语法真的只适用于属性。

有没有简单的方法来做我想做的事?

也许我的问题是我用锤子插入螺丝...

我喜欢 Mojo::DOM 和它的简单性,但也许它不太适合解析结构化 XML,我应该使用 XML::XPath:

my $xp = XML::XPath->new(xml=>$xml);
say $xp->findvalue('//TitleDetail[TitleType=01]/TitleElement/TitleText');

这就是我需要的。

可以用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;