使用Mojo :: DOM解析

时间:2012-11-08 14:31:28

标签: perl mojolicious mojo

我正在使用Mojo::UserAgent->new来获取一些具有以下格式的XML:

<row>
<td> content1 </td>
<td> content2 </td>
<td> content3 </td>
</row>
<row>
<td> content4 </td>
<td> content5 </td>
<td> content6 </td>
</row>

是否可以像这样查看结果:

content1,content2,content3
content4,content5,content6

下面是我正在使用的查询获得不同的结果

 $ua->get($url)->res->dom->at->(row)->children->each(sub {print "$_\t"})

1 个答案:

答案 0 :(得分:5)

当然,Mojo::Collection在幕后工作,这绝对是可能而且并不难。

<强>代码

# replace this line by your existing $ua->get($url)->res->dom code
my $dom = Mojo::DOM->new(do { local $/ = undef; <DATA> });

# pretty-print rows
$dom->find('row')->each(sub {
    my $row = shift;
    say $row->children->pluck('text')->join(', ');
});

数据

__DATA__
<row>
<td> content1 </td>
<td> content2 </td>
<td> content3 </td>
</row>
<row>
<td> content4 </td>
<td> content5 </td>
<td> content6 </td>
</row>

<强>输出

content1, content2, content3
content4, content5, content6

一些评论

  • each 评估集合中每个元素的代码引用( find 返回的内容)。
  • pluck 返回一个Mojo :: Collection对象,其中包含给定方法名称的返回值(在本例中为text)。这只是 map 简单内容的一种奇特方式。
  • text 自动修剪元素内容。
  • join 将Mojo :: Collection对象的所有元素连接在一起,在这种情况下,td的所有row元素都会加入。
  • 您的代码甚至无法编译,但使用 at 无论如何都无法正常工作,因为它只返回第一个匹配的DOM元素,而不是全部。您想迭代所有行。

HTH!