在 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;
我有以下 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;