1

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"})
4

1 回答 1

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)。这只是映射简单事物的一种奇特方式。
  • text自动修剪元素内容。
  • join将 Mojo::Collection 对象的所有元素连接在一起,在这种情况下td是 arow
  • 您的代码甚至无法编译,但使用at无论如何都不起作用,因为它只返回第一个匹配的 DOM 元素,而不是全部。您想迭代所有行。

于 2012-11-08T16:38:22.457 回答