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

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]语法真的只适用于属性.

有一种简单的方法可以做我想要的吗?

msc*_*cha 5

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

我喜欢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)

这就是我需要的.

  • @zdim没有任何螺丝...... Mojo :: DOM可以处理HTML和格式错误的XML,而那些模块则不能.:P (2认同)

sim*_*que 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;
Run Code Online (Sandbox Code Playgroud)